home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD2.img / d4xx / d499 / diglib / diglib.lzh / plotters / digplot.txt
Text File  |  1991-04-13  |  218KB  |  9,391 lines

  1.     SUBROUTINE GD(IFXN,XA,YA)
  2.     DIMENSION XA(8), YA(3)
  3. C
  4. C    TEK 4115B DRIVER FOR DIGLIB/VAX
  5. C        VERSION 2.1 - CURSOR POSITIONING AND HARDWARE POLYGONS
  6. C
  7.     BYTE ESC, CSUB, GS, CR, FF, US
  8.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31)
  9.     CHARACTER*(*) TERMINAL
  10.     PARAMETER (TERMINAL='TT')
  11. C
  12. C    DEFINITIONS FOR DEVICE CONTROL
  13. C
  14.     BYTE STR_END(2), STR_INIT_DEV(26), STR_WINDOW(4)
  15.     BYTE STR_BEGIN_PLOT(4)
  16.     INTEGER*2 STR_COLOR_SET(6)
  17.     BYTE STR_END_PLOT(2), STR_RLS_DEV(6)
  18.     BYTE STR_BEGIN_POLY(4), STR_END_POLY(6)
  19.     DATA STR_END /US,0/
  20.     DATA STR_INIT_DEV/
  21.     1   ESC,'%','!','0',        !CODE TEK
  22.     2   ESC,'K','A','1',        !DAENABLE YES
  23.     3   ESC,'L','M','0',        !DAMODE REPLACE
  24.     4   ESC,'M','L','1',        !LINEINDEX 1 (COLOR 1)
  25.     5   ESC,'N','U',':',        !BYPASS CANCEL CHARACTER (LF)
  26.     6   ESC,'N','T','1','=',0/    !EOL STRING <CR> <NULL>
  27.     DATA STR_WINDOW / ESC,'R','W',0/
  28.     DATA STR_BEGIN_PLOT/
  29.     1   ESC,FF,0,0/            !ERASE SCREEN
  30.     DATA STR_COLOR_SET /
  31.     1   ESC,'M','L','1',0,0/    !LINEINDEX 1 (COLOR N)
  32.     DATA STR_END_PLOT /0,0/
  33.     DATA STR_RLS_DEV /
  34.     1   ESC,'%','!','1',0,0/    !CODE ANSI
  35.     DATA STR_BEGIN_POLY / ESC,'L','P',0/
  36.     DATA STR_END_POLY / US,ESC,'L','E',2*0/
  37. C
  38. C    DEFINITIONS FOR GIN
  39. C
  40.     BYTE GINBUFR(8), PROMPT(4), STR_END_GIN(2), STR_MOVE_GIN_CURSOR(6)
  41.     DATA PROMPT /ESC, CSUB, 0, 0/
  42.     DATA IGIN_IN_CHARS /6/
  43.     DATA STR_END_GIN /10,0/
  44.     DATA STR_MOVE_GIN_CURSOR / ESC, 'S', 'X', '0', 0,0/
  45.     DATA IX_GIN_CURSOR, IY_GIN_CURSOR / 240, 180 /
  46. C
  47. C    DECLARE BUFFERING FUNCTION
  48. C
  49.     LOGICAL GB_TEST_FLUSH
  50. C
  51. C    DECLARE VARS NEED FOR DRIVER OPERATION
  52. C
  53.     LOGICAL LVECTOR_GOING, LDUMMY
  54.     DIMENSION DCHAR(8)
  55. C
  56. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  57. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  58. C
  59.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  60.     DATA DCHAR /4115.0, 34.778, 27.817, 36.776, 36.776, 255.0, 389.0, 1.0/
  61. C    DATA DCHAR /4107.0, 24.577, 18.423, 26.0, 26.0, 7.0, 389.0, 1.0/
  62. C
  63. C*****************
  64. C
  65. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  66. C
  67.     IF (IFXN .GT. 1026) GOTO 20000
  68.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  69. C
  70. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  71. C
  72.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  73. C
  74. C    *********************
  75. C    INITIALIZE THE DEVICE
  76. C    *********************
  77. C
  78. 100    CONTINUE
  79. C
  80. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  81. C
  82.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  83.     YA(1) = IERR
  84.     IF (IERR .NE. 0) RETURN
  85. C
  86. C    INITIALIZE THE 4107
  87. C
  88.     CALL GB_IN_STRING(STR_INIT_DEV)
  89.     CALL GB_IN_STRING(STR_WINDOW)
  90.     CALL GD_4010_CONVERT(0,0)
  91.     IX = INT(DCHAR(2)*XGUPCM+0.5)
  92.     IY = INT(DCHAR(3)*YGUPCM+0.5)
  93.     CALL GD_4010_CONVERT(IX,IY)
  94.     CALL GB_EMPTY
  95.     LVECTOR_GOING = .FALSE.
  96.     RETURN
  97. C
  98. C    **************************
  99. C    GET FRESH PLOTTING SURFACE
  100. C    **************************
  101. C
  102. 200    CONTINUE
  103.     CALL GB_NEW_BUFFER
  104.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  105.     CALL GB_EMPTY
  106.     LVECTOR_GOING = .FALSE.
  107.     RETURN
  108. C
  109. C    ****
  110. C    MOVE
  111. C    ****
  112. C
  113. 300    CONTINUE
  114. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  115.     IXPOSN = XGUPCM*XA(1)+0.5
  116.     IYPOSN = YGUPCM*YA(1)+0.5
  117.     LVECTOR_GOING = .FALSE.
  118.     RETURN
  119. C
  120. C    ****
  121. C    DRAW
  122. C    ****
  123. C
  124. 400    CONTINUE
  125.     IX = XGUPCM*XA(1)+0.5
  126.     IY = YGUPCM*YA(1)+0.5
  127.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  128.     IF (LVECTOR_GOING) GO TO 410
  129.     LDUMMY = GB_TEST_FLUSH(9)
  130.     LVECTOR_GOING = .TRUE.
  131.     CALL GB_INSERT(GS)
  132.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  133. 410    CALL GD_4010_CONVERT(IX,IY)
  134.     IXPOSN = IX
  135.     IYPOSN = IY
  136.     RETURN
  137. C
  138. C    *****************************
  139. C    FLUSH GRAPHICS COMMAND BUFFER
  140. C    *****************************
  141. C
  142. 500    CONTINUE
  143.     CALL GB_EMPTY
  144.     CALL GB_IN_STRING(STR_END_PLOT)
  145.     CALL GB_EMPTY
  146.     LVECTOR_GOING = .FALSE.
  147.     RETURN
  148. C
  149. C    ******************
  150. C    RELEASE THE DEVICE
  151. C    ******************
  152. C
  153. 600    CONTINUE
  154. C
  155. C    DE-ASSIGN THE CHANNAL
  156. C
  157.     CALL GB_EMPTY
  158.     CALL GB_IN_STRING(STR_WINDOW)
  159.     CALL GD_4010_CONVERT(0,0)
  160.     CALL GD_4010_CONVERT(1023,767)
  161.     CALL GB_FINISH(STR_RLS_DEV)
  162.     RETURN
  163. C
  164. C    *****************************
  165. C    RETURN DEVICE CHARACTERISTICS
  166. C    *****************************
  167. C
  168. 700    CONTINUE
  169.     DO 720 I=1,8
  170.     XA(I) = DCHAR(I)
  171. 720    CONTINUE
  172.     RETURN
  173. C
  174. C    ****************************
  175. C    SELECT CURRENT DRAWING COLOR
  176. C    ****************************
  177. C
  178. 800    CONTINUE
  179.     LDUMMY = GB_TEST_FLUSH(6)
  180.     ICOLOR = XA(1)
  181.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 255) RETURN
  182.     STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER
  183.     CALL GB_IN_STRING(STR_COLOR_SET)
  184.     LVECTOR_GOING = .FALSE.
  185.     RETURN
  186. C
  187. C    **********************
  188. C    PERFORM GRAPHICS INPUT
  189. C    **********************
  190. C
  191. 900    CONTINUE
  192. C
  193. C    POSITION CURSOR TO ITS LAST GIN POSITION (ELSE MIDDLE OF SCREEN)
  194. C
  195.     CALL GB_TEST_FLUSH(10)
  196.     CALL GB_IN_STRING(STR_MOVE_GIN_CURSOR)
  197.     CALL GD_4010_CONVERT(IX_GIN_CURSOR,IY_GIN_CURSOR)
  198.     CALL GB_EMPTY
  199. C
  200.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  201. C
  202.     ICHAR = GINBUFR(1)
  203.     IX1 = GINBUFR(2)
  204.     IX2 = GINBUFR(3)
  205.     IY1 = GINBUFR(4)
  206.     IY2 = GINBUFR(5)
  207. C
  208.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  209.     IX_GIN_CURSOR = 32*IAND(IX1,31)+IAND(IX2,31)
  210.     XA(2) = IX_GIN_CURSOR/XGUPCM
  211.     IY_GIN_CURSOR = 32*IAND(IY1,31)+IAND(IY2,31)
  212.     XA(3) = IY_GIN_CURSOR/YGUPCM
  213. C
  214.     CALL GB_IN_STRING(STR_END_GIN)
  215.     CALL GB_EMPTY
  216.     RETURN
  217. C
  218. C    *******************
  219. C    DRAW FILLED POLYGON
  220. C    *******************
  221. C
  222. 20000    CONTINUE
  223.     NPTS = IFXN - 1024
  224.     IX = XGUPCM*XA(1)+0.5
  225.     IY = YGUPCM*YA(1)+0.5
  226.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(20))
  227.     IF (LVECTOR_GOING) THEN
  228.         CALL GB_INSERT(US)
  229.         LVECTOR_GOING = .FALSE.
  230.     ENDIF
  231.     CALL GB_IN_STRING(STR_BEGIN_POLY)
  232.     CALL GD_4010_CONVERT(IX,IY)
  233. C
  234. C    DO VERTICES 2 THRU N.   NOTE: WE START WITH A <GS> SINCE
  235. C     LVECTOR_GOING IS "FALSE"
  236. C
  237.         DO 20010 I = 2, NPTS
  238. C        MAKE SURE 10 CHARS (4 FOR X,Y AND 6 FOR END POLYGON)
  239.         LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(10))
  240.         IF (.NOT. LVECTOR_GOING) CALL GB_INSERT(GS)
  241.         CALL GD_4010_CONVERT(INT(XGUPCM*XA(I)+0.5),
  242.     1        INT(YGUPCM*YA(I)+0.5))
  243. 20010        CONTINUE
  244.     CALL GB_IN_STRING(STR_END_POLY)
  245.     LVECTOR_GOING = .FALSE.
  246.     RETURN
  247.     END
  248.     SUBROUTINE GD1012_LONG(IFXN,XA,YA)
  249.     DIMENSION XA(8), YA(3)
  250. C
  251. C    CalComp 1012 plotter driver for VMS
  252. C
  253. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  254. C
  255. C    PLOTTER COMMANDS, ETC.
  256. C
  257. C
  258.     INTEGER CMD_INIT_PLOTTER_SIZE, CMD_PEN_UP_SIZE,
  259.     1   CMD_INDEX_PLOTTER_SIZE, CMD_PEN_DOWN_SIZE, CMD_SELECT_PEN_SIZE,
  260.     2   CMD_MAX_DELTA_SIZE
  261.     PARAMETER (CMD_INIT_PLOTTER_SIZE = 32)
  262.     PARAMETER (CMD_PEN_UP_SIZE = 1)
  263.     PARAMETER (CMD_INDEX_PLOTTER_SIZE = 3)
  264.     PARAMETER (CMD_PEN_DOWN_SIZE = 1)
  265.     PARAMETER (CMD_SELECT_PEN_SIZE = 2)
  266.     PARAMETER (IPEN_NUMBER_POSITION = 2)
  267.     PARAMETER (CMD_MAX_DELTA_SIZE = 7)
  268.     BYTE RESPONSE_CHARACTER, RC1, RC2
  269.     PARAMETER (RESPONSE_CHARACTER = '&')
  270.     PARAMETER (RC1 = RESPONSE_CHARACTER/16)
  271.     PARAMETER (RC2 = RESPONSE_CHARACTER-16*RC1)
  272.     BYTE CMD_INIT_PLOTTER(CMD_INIT_PLOTTER_SIZE+1),
  273.     1   CMD_PEN_UP(CMD_PEN_UP_SIZE+1),
  274.     2   CMD_INDEX_PLOTTER(CMD_INDEX_PLOTTER_SIZE+1),
  275.     3   CMD_PEN_DOWN(CMD_PEN_DOWN_SIZE+1),
  276.     4   CMD_SELECT_PEN(CMD_SELECT_PEN_SIZE+1)
  277.     DATA CMD_INIT_PLOTTER /
  278.     1   7,63,        !RADIX 64
  279.     2   8,1,        !ENABLE DOUBLE BUFFERING IN PLOTTER
  280.     3   8,2,0,        !RESPONSE SUFFIX LENGTH IS 0
  281.     4   8,3,0,        !TURN-AROUND DELAY IS 0
  282.     5   8,4,1,3,0,        !PACKET ACCEPTED RESPONSE IS '0'
  283.     6   8,5,1,3,1,        !PACKET REJECTED RESPONSE IS '1'
  284.     7   8,6,1,RC1,RC2,    !RESPONSE REQUEST CHARACTER
  285.     9   4,1,        !SELECT PEN 1
  286.     1   9,1,        !SCALE FACTOR IS 1
  287.     2   11,0,6,-1/        !INDEX THE PLOTTER
  288.     DATA CMD_PEN_UP / 3,-1/    !PEN UP COMMAND
  289.     DATA CMD_INDEX_PLOTTER /
  290.     1   11,0,6,-1/        !INDEX THE PLOTTER
  291.     DATA CMD_PEN_DOWN /
  292.     1   2,-1/        !PEN UP COMANND
  293.     DATA CMD_SELECT_PEN /
  294.     1   4, 1,-1/        !SELECT PEN COMMAND
  295. C
  296.     LOGICAL LONG, LFRESH_PAGE
  297. C
  298. C    STANDARD DEVICE DRIVER STUFF
  299. C
  300.     DIMENSION DCHAR(8)
  301.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  302. C    Note: Table is set up for TALL mode.
  303.     DATA DCHAR /1012.0, 21.0, 27.3, 200.0, 200.0, 4.0, 24.0, 40.0/
  304. C
  305. C    DECLARE BUFFERING FUNCTION
  306. C
  307.     LOGICAL GH_TEST_FLUSH
  308. C
  309. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  310. C
  311.     LONG = .TRUE.
  312.     GO TO 10
  313.     ENTRY GD1012_TALL(IFXN,XA,YA)
  314.     LONG = .FALSE.
  315. 10    CONTINUE
  316. C
  317. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  318. C
  319.     IF (IFXN .LE. 0 .OR. IFXN .GT. 8) RETURN
  320.     GO TO (100,200,300,400,500,600,700,800) IFXN
  321. C
  322. C    *********************
  323. C    INITIALIZE THE DEVICE
  324. C    *********************
  325. C
  326. 100    CONTINUE
  327. C
  328. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  329. C
  330.     CALL GH_INITIALIZE(IERR)
  331.     YA(1) = IERR
  332.     IF (IERR .NE. 0) RETURN
  333.     CALL GH_TIMED
  334.     CALL GH_IN_BIASED(CMD_INIT_PLOTTER)
  335.     CALL GH_EMPTY
  336.     CALL GH_NO_TIMED
  337.     GO TO 280
  338. C
  339. C    **************************
  340. C    GET FRESH PLOTTING SURFACE
  341. C    **************************
  342. C
  343. 200    CONTINUE
  344.     CALL GH_NEW_BUFFER
  345.     CMD_SELECT_PEN(IPEN_NUMBER_POSITION) = 1
  346.     CALL GH_IN_BIASED(CMD_SELECT_PEN)
  347.     IF (.NOT. LFRESH_PAGE) THEN
  348.         CALL GD1012_CONVERT(4200-IXPOSN,0-IYPOSN)
  349.     ENDIF
  350.     LFRESH_PAGE = .TRUE.
  351.     CALL GH_IN_BIASED(CMD_INDEX_PLOTTER)
  352. 280    CONTINUE
  353.     LFRESH_PAGE = .TRUE.
  354.     LPEN_DOWN = .FALSE.    !RAISED BY SELECT PEN
  355.     IXPOSN = 25
  356.     IYPOSN = -25
  357.     IPEN = 1
  358.     CALL GH_EMPTY
  359.     RETURN
  360. C
  361. C    ****
  362. C    MOVE
  363. C    ****
  364. C
  365. 300    CONTINUE
  366.     CALL GH_TEST_FLUSH(CMD_MAX_DELTA_SIZE+CMD_PEN_UP_SIZE)
  367.     IF (LPEN_DOWN) THEN
  368.         CALL GH_IN_BIASED(CMD_PEN_UP)
  369.         LPEN_DOWN = .FALSE.
  370.     ENDIF
  371.     GO TO 420
  372. C
  373. C    ****
  374. C    DRAW
  375. C    ****
  376. C
  377. 400    CONTINUE
  378.     CALL GH_TEST_FLUSH(CMD_MAX_DELTA_SIZE+CMD_PEN_DOWN_SIZE)
  379.     IF (.NOT. LPEN_DOWN) THEN
  380.         CALL GH_IN_BIASED(CMD_PEN_DOWN)
  381.         LPEN_DOWN = .TRUE.
  382.     ENDIF
  383.     LFRESH_PAGE = .FALSE.
  384. 420    CONTINUE
  385.     IX = XGUPCM*XA(1)+0.5
  386.     IY = YGUPCM*YA(1)+0.5
  387.     IF (LONG) THEN
  388.         ITEMP = IX
  389.         IX = IY
  390.         IY = 5462-ITEMP
  391.     ENDIF
  392.     CALL GD1012_CONVERT(IX-IXPOSN,IY-IYPOSN)
  393.     IXPOSN = IX
  394.     IYPOSN = IY
  395.     RETURN
  396. C
  397. C    *****************************
  398. C    FLUSH GRAPHICS COMMAND BUFFER
  399. C    *****************************
  400. C
  401. 500    CONTINUE
  402.     CALL GH_EMPTY
  403.     RETURN
  404. C
  405. C    ******************
  406. C    RELEASE THE DEVICE
  407. C    ******************
  408. C
  409. 600    CONTINUE
  410.     CMD_SELECT_PEN(IPEN_NUMBER_POSITION) = 1
  411.     CALL GH_IN_BIASED(CMD_SELECT_PEN)
  412.     CALL GD1012_CONVERT(4200-IXPOSN,0-IYPOSN)
  413.     CALL GH_IN_BIASED(CMD_INDEX_PLOTTER)
  414.     CALL GH_EMPTY
  415.     CALL GH_FINISH
  416.     RETURN
  417. C
  418. C    *****************************
  419. C    RETURN DEVICE CHARACTERISTICS
  420. C    *****************************
  421. C
  422. 700    CONTINUE
  423.     DO 720 I=1,8
  424.     XA(I) = DCHAR(I)
  425. 720    CONTINUE
  426.     IF (LONG) THEN
  427.         XA(2) = DCHAR(3)
  428.         XA(3) = DCHAR(2)
  429.         XA(1) = XA(1) + 0.5
  430.     ENDIF
  431.     RETURN
  432. C
  433. C    ****************************
  434. C    SELECT CURRENT DRAWING COLOR
  435. C    ****************************
  436. C
  437. 800    CONTINUE
  438.     CALL GH_TEST_FLUSH(CMD_SELECT_PEN_SIZE)
  439.     ICOLOR = XA(1)
  440.     IF (ICOLOR .LE. 0 .OR. ICOLOR .GT. 4) RETURN
  441.     IF (ICOLOR .NE. IPEN) THEN
  442.         CMD_SELECT_PEN(IPEN_NUMBER_POSITION) = ICOLOR
  443.         CALL GH_IN_BIASED(CMD_SELECT_PEN)
  444.         IPEN = ICOLOR
  445.     ENDIF
  446.     RETURN
  447.     END
  448.  
  449.     SUBROUTINE GD1012_CONVERT(IDX,IDY)
  450. C
  451. C    THIS SUBROUTINE CONVERTS AND INSERTS THE DELTA WITH THE
  452. C     PROPER DELTA CODE.
  453. C
  454.     PARAMETER (IRADIX = 64)
  455.     BYTE RBUFR(8), BDELTAS(7,7)
  456.     DATA RBUFR(8) /-1/
  457.     DATA BDELTAS / 19,43,47,31,46,42,18,
  458.     2   51,23,59,35,58,22,50,
  459.     3   55,63,27,39,26,62,54,
  460.     4   29,33,37,-1,38,34,30,
  461.     5   53,61,25,36,24,60,52,
  462.     6   49,21,57,32,56,20,48,
  463.     7   17,41,45,28,44,40,16/
  464. C
  465.     IF (IDX .EQ. 0 .AND. IDY .EQ. 0) RETURN
  466.     I = 7
  467.     ICOORD = IABS(IDY)
  468.     DO 200 J=1,2
  469.         ISTART = I
  470. 100            CONTINUE
  471.             IF (ICOORD .EQ. 0) GO TO 190
  472.             RBUFR(I) = ICOORD .AND. (IRADIX-1)
  473.             I = I-1
  474.             ICOORD = ICOORD/IRADIX
  475.             GO TO 100
  476. 190        CONTINUE
  477.         IF (J .EQ. 1) THEN
  478.             NY = 4 + ISIGN(1,IDY)*(ISTART-I)
  479.             ICOORD = IABS(IDX)
  480.         ENDIF
  481. 200        CONTINUE
  482.     RBUFR(I) = BDELTAS(4+ISIGN(1,IDX)*(ISTART-I),NY)
  483. D    type 9999, idx,idy, (rbufr(j), j=i,8)
  484. D9999    format(' The delta command for (',i5,',',i5,') is:'/2x,8i8)
  485. D    type 9998
  486. D9998    format(/)
  487.     CALL GH_IN_BIASED(RBUFR(I))
  488.     RETURN
  489.     END
  490.  
  491.  
  492.     SUBROUTINE GH_INITIALIZE(IERR)
  493. C
  494.     BYTE BIAS, STMSG, RESPONSE_CHARACTER, PACKET_ACCEPTED_CHAR
  495.     PARAMETER (BIAS    = 32)
  496.     PARAMETER (STMSG = 2)
  497.     PARAMETER (RESPONSE_CHARACTER = '&')
  498.     PARAMETER (PACKET_ACCEPTED_CHAR = '0')
  499. C
  500.     INCLUDE '($SSDEF)'
  501.     INCLUDE 'GD1012.CMN'
  502. C
  503.     CHARACTER*(*) DEVICE_NAME
  504.     PARAMETER (DEVICE_NAME='CALCOMP_TERM')
  505.     INTEGER*4 SYS$ASSIGN
  506. C
  507. C    ASSIGN A CHANNEL TO THE DEVICE OUTPUT DEVICE
  508. C
  509. 10    continue
  510.     ISTAT = SYS$ASSIGN(DEVICE_NAME,IOCHAN,,)
  511.     if (istat .eq. ss$_devalloc) then
  512.         type 11
  513. 11        format(' Waiting 10 seconds for plotter to become free.')
  514.         call lib$wait(10.0)
  515.         goto 10
  516.     endif
  517.     IF (.NOT. ISTAT) THEN
  518.         IERR = 1
  519.         RETURN
  520.         ELSE
  521.         IERR = 0
  522.     ENDIF
  523.     type 21
  524. 21    format(
  525.     1' Please make sure the CalComp is connected to the "BLACK BOX".'/
  526.     2'$Hit "Return" when the connection is made:')
  527.     accept 22, istat
  528. 22    format(a1)
  529. C
  530. C    PLACED FIXED START OF PACKET FOR PLOTTER
  531. C
  532.     BIASCHAR = BIAS
  533.     RESPCHAR = RESPONSE_CHARACTER
  534.     GOODCHAR = PACKET_ACCEPTED_CHAR
  535.     BUFFER(1) = STMSG
  536.     BUFFER(2) = BIASCHAR
  537.     CALL GH_NEW_BUFFER
  538.     RETURN
  539.     END
  540.  
  541.  
  542.  
  543.     SUBROUTINE GH_NEW_BUFFER
  544. C
  545. C    SUBROUTINE TO INITIALIZE THE GRAPHIC COMMAND BUFFER
  546. C
  547. C
  548.     INCLUDE 'GD1012.CMN'
  549. C
  550. C
  551.     IBUFPTR = 3
  552.     ICHECK_SUM = 0
  553.     RETURN
  554.     END
  555.  
  556.  
  557.  
  558.     FUNCTION GH_TEST_FLUSH(NUMCHR)
  559.     LOGICAL GH_TEST_FLUSH
  560. C
  561. C    THIS SUBROUTINE CHECKS TO MAKE SURE THERE IS ENOUGH ROOM IN
  562. C    THE BUFFER FOR "NUMCHR" MORE CHARACTERS, IF NOT, IF MAKES ROOM BY
  563. C    EMPTYING THE BUFFER.
  564. C
  565.     PARAMETER (IEND_LENGTH = 3)
  566. C
  567. C
  568.     INCLUDE 'GD1012.CMN'
  569. C
  570. C
  571.     IF (IBUFPTR+NUMCHR+IEND_LENGTH .GE. IBUFSIZ) THEN
  572.         CALL GH_EMPTY
  573.         GH_TEST_FLUSH = .TRUE.
  574.         ELSE
  575.         GH_TEST_FLUSH = .FALSE.
  576.         ENDIF
  577.     RETURN
  578.     END
  579.  
  580.  
  581.  
  582.     SUBROUTINE GH_EMPTY
  583. C
  584. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  585. C
  586.     BYTE EOMSG, CR
  587.     PARAMETER (EOMSG = 3)
  588.     PARAMETER (CR = 13)
  589. C
  590. C
  591.     INCLUDE 'GD1012.CMN'
  592. C
  593. C
  594.     IF (IBUFPTR .LE. 3) GO TO 900
  595.     CALL GH_INSERT(96-(ICHECK_SUM .AND. 31))
  596.     CALL GH_INSERT(EOMSG)
  597.     CALL GH_INSERT(CR)
  598.     IF (IBUFPTR .GT. IBUFSIZ+1) STOP 'BUFFERING ERROR - BUFFER OVERFLOWED'
  599. C
  600. C    SEND TO PLOTTER
  601. C
  602.     CALL GH_SEND
  603. 900    CALL GH_NEW_BUFFER
  604.     RETURN
  605.     END
  606.  
  607.  
  608.  
  609.     SUBROUTINE GH_SEND
  610. C
  611. C    *** VMS SPECIFIC ***
  612. C
  613.     INCLUDE '($IODEF)'
  614.     INCLUDE '($SSDEF)'
  615. C
  616.     INCLUDE 'GD1012.CMN'
  617. C
  618.     INTEGER*4 CR_CONTROL
  619.     PARAMETER (CR_CONTROL = 0)
  620. C
  621.     INTEGER*4 SYS$QIOW
  622.     INTEGER*2 IOSB(4)
  623.     BYTE INBUF
  624. C
  625. C    DO THE QIOW TO THE OUTPUT DEVICE
  626. C
  627. 10    CONTINUE
  628.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  629.     1   %VAL(IO$_WRITEVBLK+IO$M_NOFORMAT),IOSB, , ,
  630.     2   BUFFER,%VAL(IBUFPTR-1),5,%VAL(CR_CONTROL), , )
  631.     IF (.NOT. ISTAT) then
  632.         type 999, istat
  633. 999        format(' Write QIOW to CalComp failed, status was ',i9)
  634.         stop
  635.     ENDIF
  636.     IFXN = IO$_READPROMPT+IO$M_NOECHO+IO$M_PURGE
  637.     IF (LTIMED) IFXN = IFXN + IO$M_TIMED
  638.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  639.     1   %VAL(IFXN),IOSB, , ,
  640.     2   INBUF,%VAL(1),%VAL(2), ,RESPCHAR,%VAL(1))
  641.     IF (ISTAT .EQ. SS$_TIMEOUT) THEN
  642.         TYPE 901
  643. 901        FORMAT(/'$Please make the CalComp ready, then hit RETURN')
  644.         ACCEPT 902, I
  645. 902        FORMAT(A1)
  646.         GO TO 10
  647.     ENDIF
  648.     IF (.NOT. ISTAT) then
  649.         type 998, istat
  650. 998        format(' ReadPrompt QIOW to CalComp failed, status was ',i9)
  651.         call lib$stop(%val(istat))
  652.     ENDIF
  653.     IF (INBUF .NE. GOODCHAR) THEN
  654.         type 997
  655. 997        format(' DIGLIB - informative: CalComp transmission error')
  656. D        type 9999, INBUF
  657. D9999        format(' The bad character is decimal ',I4/
  658. D    1    '$Hit return to try again')
  659. D        ACCEPT 9998, INBUF
  660. D9998        FORMAT(A1)
  661.         GO TO 10
  662.     ENDIF
  663.     RETURN
  664.     END
  665.  
  666.  
  667.     SUBROUTINE GH_TIMED
  668. C
  669.     INCLUDE 'GD1012.CMN'
  670. C
  671.     LTIMED = .TRUE.
  672.     RETURN
  673.     END
  674.  
  675.  
  676.     SUBROUTINE GH_NO_TIMED
  677. C
  678.     INCLUDE 'GD1012.CMN'
  679. C
  680.     LTIMED = .FALSE.
  681.     RETURN
  682.     END
  683.  
  684.  
  685.     SUBROUTINE GH_INSERT(BCHAR)
  686.     BYTE BCHAR
  687. C
  688. C    THIS SUBROUTINE INSERTS A CHARACTER INTO THE BUFFER
  689. C
  690. C
  691.     INCLUDE 'GD1012.CMN'
  692. C
  693. C
  694.     BUFFER(IBUFPTR) = BCHAR
  695.     ICHECK_SUM = ICHECK_SUM + BCHAR
  696.     IBUFPTR = IBUFPTR + 1
  697.     RETURN
  698.     END
  699.  
  700.  
  701.     SUBROUTINE GH_IN_BIASED(STRING)
  702.     BYTE STRING(2)
  703. C
  704. C    THIS SUBROUTINE INSERTS THE STRING INTO THE GRAPHICS BUFFER
  705. C
  706. C
  707.     INCLUDE 'GD1012.CMN'
  708. C
  709.     I = 1
  710. 100        CONTINUE
  711.         IF (STRING(I) .EQ. -1) RETURN
  712.         CALL GH_INSERT(STRING(I)+BIASCHAR)
  713.         I = I + 1
  714.         GO TO 100
  715.     END
  716.  
  717.  
  718.     SUBROUTINE GH_FINISH()
  719. C
  720. C    *** VMS SPECIFIC ***
  721. C
  722. C    THIS SUBROUTINE RELEASES THE I/O CHANNAL TO THE PLOTTER
  723. C
  724. C
  725.     INCLUDE 'GD1012.CMN'
  726. C
  727. C
  728.     INTEGER*4 SYS$DASSGN
  729. C
  730.     ISTAT = SYS$DASSGN(%VAL(IOCHAN))
  731.     RETURN
  732.     END
  733.     SUBROUTINE GD2623(IFXN,XA,YA)
  734.     DIMENSION XA(8), YA(3)
  735. C
  736. C    HP 2623 DRIVER FOR DIGLIB/VAX
  737. C
  738. C-----------------------------------------------------------------------
  739. C
  740.     BYTE ESC, DC1, BPENUP
  741.     PARAMETER (ESC=27)
  742.     PARAMETER (DC1=17)
  743.     PARAMETER (BPENUP = 97)
  744.  
  745.     CHARACTER*(*) TERMINAL
  746.     PARAMETER (TERMINAL='TT')
  747. C
  748. C    DEVICE CONTROL DEFINITIONS
  749. C
  750.     BYTE CHAR_TERM, STR_END(2), STR_BEGIN_PLOT(24)
  751.     BYTE STR_END_PLOT(6), STR_COLOR_SET(6)
  752.     BYTE STR_START_VEC(6), STR_RLS_DEV(6)
  753.     BYTE BDUMMY, BINTERLOCK(2)
  754.     DATA BINTERLOCK /5,0/        !ENQUIRE FOR 2648 HANDSHAKE
  755.     DATA CHAR_TERM /'Z'/
  756.     DATA STR_END /13,0/
  757.     DATA STR_BEGIN_PLOT /
  758.     1   ESC,'H',            !HOME ALPHA CURSOR
  759.     2   ESC,'J',            !ERASE TO END OF ALPHA MEMORY
  760.     3   ESC,'*','d','A',        !CLEAR GRAPHICS MEMORY
  761.     4   ESC,'*','d','C',        !GRAPHICS DISPLAY ON
  762.     5   ESC,'*','m','2','A',    !SET FOREGROUND TO DOTS ON
  763.     6   ESC,'*','m','1','B',2*0/    !SET SOLID LINES
  764.     DATA STR_END_PLOT /
  765.     1   ESC,'H',            !HOME ALPHA CURSOR
  766.     2   ESC,'J',2*0/        !ERASE TO END OF ALPHA MEMORY
  767.     DATA STR_COLOR_SET /
  768.     1   ESC,'*','m','1','A',0/    !1 ==> DOTS ON, 2 ==> DOTS OFF
  769.     DATA STR_START_VEC /
  770.     1   ESC,'*','p','i',2*0/    !START VECTOR
  771.     DATA STR_RLS_DEV /
  772.     1   ESC,'*','d','D',2*0/    !TURN GRAPHICS OFF
  773. C
  774. C    GIN DEFINITIONS
  775. C
  776.     BYTE GINBUFR(28), PROMPT(8), PLUS_SIGN
  777.     DATA PROMPT /ESC,'*','s','4','^',DC1,2*0/
  778.     DATA PLUS_SIGN /'+'/
  779. C
  780. C    DECLARE BUFFERING FUNCTION TO BE LOGICAL
  781. C
  782.     LOGICAL GB_TEST_FLUSH
  783.  
  784. C
  785. C    DELCARE VARS NEEDED FOR DRIVER OPERATION
  786. C
  787.     LOGICAL LVECTOR_GOING
  788. C
  789.     DIMENSION DCHAR(8)
  790. C
  791. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  792. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  793. C
  794.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  795.     DATA DCHAR /2623.0, 21.689, 16.511, 23.56, 23.56, 1.0, 133.0, 1.0/
  796. C
  797. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  798. C
  799.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  800. C
  801. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  802. C
  803.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  804. C
  805. C    *********************
  806. C    INITIALIZE THE DEVICE
  807. C    *********************
  808. C
  809. 100    CONTINUE
  810.     CALL GB_INITIALIZE(CHAR_TERM,STR_END,TERMINAL,IERR)
  811.     YA(1) =IERR
  812.     GO TO 290
  813. C
  814. C    **************************
  815. C    GET FRESH PLOTTING SURFACE
  816. C    **************************
  817. C
  818. 200    CONTINUE
  819.     CALL GB_NEW_BUFFER
  820.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  821.     CALL GB_EMPTY
  822. 290    LVECTOR_GOING = .FALSE.
  823.     RETURN
  824. C
  825. C    ****
  826. C    MOVE
  827. C    ****
  828. C
  829. 300    CONTINUE
  830. C    MAKE DECISION ON MOVE/DRAW LATER
  831. C
  832. C    ****
  833. C    DRAW
  834. C    ****
  835. C
  836. 400    CONTINUE
  837.     IXPOSN = XGUPCM*XA(1)+0.5
  838.     IYPOSN = YGUPCM*YA(1)+0.5
  839.     IF (.NOT. LVECTOR_GOING) THEN
  840.         CALL GB_INTERLOCK(BINTERLOCK,BDUMMY,1)
  841.         LDUMMY = GB_TEST_FLUSH(18)
  842.         CALL GB_IN_STRING(STR_START_VEC)
  843.         CALL GB_USE_TERMINATOR
  844.         LVECTOR_GOING = .TRUE.
  845.       ENDIF
  846.     IF (IFXN .EQ. 3) CALL GB_INSERT(BPENUP)    !IF MOVE, DO PEN-UP FIRST
  847.     CALL GD26CONVERT(IXPOSN,IYPOSN)
  848.     LVECTOR_GOING = .NOT. GB_TEST_FLUSH(6)
  849.     RETURN
  850. C
  851. C    *****************************
  852. C    FLUSH GRAPHICS COMMAND BUFFER
  853. C    *****************************
  854. C
  855. 500    CONTINUE
  856.     CALL GB_EMPTY
  857.     CALL GB_IN_STRING(STR_END_PLOT)
  858.     CALL GB_EMPTY
  859.     GO TO 290
  860. C
  861. C    ******************
  862. C    RELEASE THE DEVICE
  863. C    ******************
  864. C
  865. 600    CONTINUE
  866.     CALL GB_FINISH(STR_RLS_DEV)
  867.     RETURN
  868. C
  869. C    *****************************
  870. C    RETURN DEVICE CHARACTERISTICS
  871. C    *****************************
  872. C
  873. 700    CONTINUE
  874.     DO 720 I=1,8
  875.     XA(I) = DCHAR(I)
  876. 720    CONTINUE
  877.     RETURN
  878. C
  879. C    ****************************
  880. C    SELECT CURRENT DRAWING COLOR
  881. C    ****************************
  882. C
  883. 800    CONTINUE
  884.     CALL GB_EMPTY
  885.     ICOLOR = XA(1)
  886.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  887.     IF (ICOLOR .EQ. 0) THEN
  888.         STR_COLOR_SET(4) = '1'
  889.       ELSE
  890.         STR_COLOR_SET(4) = '2'
  891.       ENDIF
  892.     CALL GB_IN_STRING(STR_COLOR_SET)
  893.     GO TO 290
  894. C
  895. C    **********************
  896. C    PERFORM GRAPHICS INPUT
  897. C    **********************
  898. C
  899. 900    CONTINUE
  900.     CALL GB_EMPTY
  901. C
  902. C    ASK FOR 1 GIN INPUT
  903. C
  904. C
  905.     CALL GB_GIN(PROMPT,27,.FALSE.,GINBUFR)
  906. C
  907. C    GET THE KEY, X POSITION, AND Y POSITION
  908. C
  909. C
  910.     IPTR = 0
  911. 910    IPTR = IPTR + 1
  912.     IF (GINBUFR(IPTR) .NE. PLUS_SIGN) GO TO 910
  913.     DECODE (17,911,GINBUFR(IPTR)) IX, IY, ICHAR
  914. 911    FORMAT(I6,1X,I6,1X,I3)
  915.     XA(1) = ICHAR    !PICK CHARACTER
  916.     XA(2) = FLOAT(IX)/XGUPCM    !X IN CM.
  917.     XA(3) = FLOAT(IY)/YGUPCM    !Y IN CM.
  918.     GO TO 290
  919.     END
  920.     SUBROUTINE GD2648(IFXN,XA,YA)
  921.     DIMENSION XA(8), YA(3)
  922. C
  923. C    HP 2648 DRIVER FOR DIGLIB/VAX
  924. C
  925. C-----------------------------------------------------------------------
  926. C
  927.     BYTE ESC, DC1, BPENUP
  928.     PARAMETER (ESC=27)
  929.     PARAMETER (DC1=17)
  930.     PARAMETER (BPENUP = 97)
  931.  
  932.     CHARACTER*(*) TERMINAL
  933.     PARAMETER (TERMINAL='TT')
  934. C
  935. C    DEVICE CONTROL DEFINITIONS
  936. C
  937.     BYTE CHAR_TERM, STR_END(2), STR_BEGIN_PLOT(24)
  938.     BYTE STR_END_PLOT(6), STR_COLOR_SET(6)
  939.     BYTE STR_START_VEC(6), STR_RLS_DEV(6)
  940.     BYTE BDUMMY, BINTERLOCK(2)
  941.     DATA BINTERLOCK /5,0/        !ENQUIRE FOR 2648 HANDSHAKE
  942.     DATA CHAR_TERM /'Z'/
  943.     DATA STR_END /13,0/
  944.     DATA STR_BEGIN_PLOT /
  945.     1   ESC,'H',            !HOME ALPHA CURSOR
  946.     2   ESC,'J',            !ERASE TO END OF ALPHA MEMORY
  947.     3   ESC,'*','d','A',        !CLEAR GRAPHICS MEMORY
  948.     4   ESC,'*','d','C',        !GRAPHICS DISPLAY ON
  949.     5   ESC,'*','m','2','A',    !SET FOREGROUND TO DOTS ON
  950.     6   ESC,'*','m','1','B',2*0/    !SET SOLID LINES
  951.     DATA STR_END_PLOT /
  952.     1   ESC,'H',            !HOME ALPHA CURSOR
  953.     2   ESC,'J',2*0/        !ERASE TO END OF ALPHA MEMORY
  954.     DATA STR_COLOR_SET /
  955.     1   ESC,'*','m','1','A',0/    !1 ==> DOTS ON, 2 ==> DOTS OFF
  956.     DATA STR_START_VEC /
  957.     1   ESC,'*','p','i',2*0/    !START VECTOR
  958.     DATA STR_RLS_DEV /
  959.     1   ESC,'*','d','D',2*0/    !TURN GRAPHICS OFF
  960. C
  961. C    GIN DEFINITIONS
  962. C
  963.     BYTE GINBUFR(28), PROMPT(8), PLUS_SIGN
  964.     DATA PROMPT /ESC,'*','s','4','^',DC1,2*0/
  965.     DATA PLUS_SIGN /'+'/
  966. C
  967. C    DECLARE BUFFERING FUNCTION TO BE LOGICAL
  968. C
  969.     LOGICAL GB_TEST_FLUSH
  970.  
  971. C
  972. C    DELCARE VARS NEEDED FOR DRIVER OPERATION
  973. C
  974.     LOGICAL LVECTOR_GOING
  975. C
  976.     DIMENSION DCHAR(8)
  977. C
  978. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  979. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  980. C
  981.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  982.     DATA DCHAR /2648.0, 23.967, 11.967, 30.0, 30.0, 1.0, 133.0, 1.0/
  983. C
  984. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  985. C
  986.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  987. C
  988. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  989. C
  990.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  991. C
  992. C    *********************
  993. C    INITIALIZE THE DEVICE
  994. C    *********************
  995. C
  996. 100    CONTINUE
  997.     CALL GB_INITIALIZE(CHAR_TERM,STR_END,TERMINAL,IERR)
  998.     YA(1) = IERR
  999.     GO TO 290
  1000. C
  1001. C    **************************
  1002. C    GET FRESH PLOTTING SURFACE
  1003. C    **************************
  1004. C
  1005. 200    CONTINUE
  1006.     CALL GB_NEW_BUFFER
  1007.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1008.     CALL GB_EMPTY
  1009. 290    LVECTOR_GOING = .FALSE.
  1010.     RETURN
  1011. C
  1012. C    ****
  1013. C    MOVE
  1014. C    ****
  1015. C
  1016. 300    CONTINUE
  1017. C    MAKE DECISION ON MOVE/DRAW LATER
  1018. C
  1019. C    ****
  1020. C    DRAW
  1021. C    ****
  1022. C
  1023. 400    CONTINUE
  1024.     IXPOSN = XGUPCM*XA(1)+0.5
  1025.     IYPOSN = YGUPCM*YA(1)+0.5
  1026.     IF (.NOT. LVECTOR_GOING) THEN
  1027.         CALL GB_INTERLOCK(BINTERLOCK,BDUMMY,1)
  1028.         LDUMMY = GB_TEST_FLUSH(18)
  1029.         CALL GB_IN_STRING(STR_START_VEC)
  1030.         CALL GB_USE_TERMINATOR
  1031.         LVECTOR_GOING = .TRUE.
  1032.       ENDIF
  1033.     IF (IFXN .EQ. 3) CALL GB_INSERT(BPENUP)    !IF MOVE, DO PEN-UP FIRST
  1034.     CALL GD26CONVERT(IXPOSN,IYPOSN)
  1035.     LVECTOR_GOING = .NOT. GB_TEST_FLUSH(6)
  1036.     RETURN
  1037. C
  1038. C    *****************************
  1039. C    FLUSH GRAPHICS COMMAND BUFFER
  1040. C    *****************************
  1041. C
  1042. 500    CONTINUE
  1043.     CALL GB_EMPTY
  1044.     CALL GB_IN_STRING(STR_END_PLOT)
  1045.     CALL GB_EMPTY
  1046.     GO TO 290
  1047. C
  1048. C    ******************
  1049. C    RELEASE THE DEVICE
  1050. C    ******************
  1051. C
  1052. 600    CONTINUE
  1053.     CALL GB_FINISH(STR_RLS_DEV)
  1054.     RETURN
  1055. C
  1056. C    *****************************
  1057. C    RETURN DEVICE CHARACTERISTICS
  1058. C    *****************************
  1059. C
  1060. 700    CONTINUE
  1061.     DO 720 I=1,8
  1062.     XA(I) = DCHAR(I)
  1063. 720    CONTINUE
  1064.     RETURN
  1065. C
  1066. C    ****************************
  1067. C    SELECT CURRENT DRAWING COLOR
  1068. C    ****************************
  1069. C
  1070. 800    CONTINUE
  1071.     CALL GB_EMPTY
  1072.     ICOLOR = XA(1)
  1073.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  1074.     IF (ICOLOR .EQ. 0) THEN
  1075.         STR_COLOR_SET(4) = '1'
  1076.       ELSE
  1077.         STR_COLOR_SET(4) = '2'
  1078.       ENDIF
  1079.     CALL GB_IN_STRING(STR_COLOR_SET)
  1080.     GO TO 290
  1081. C
  1082. C    **********************
  1083. C    PERFORM GRAPHICS INPUT
  1084. C    **********************
  1085. C
  1086. 900    CONTINUE
  1087.     CALL GB_EMPTY
  1088. C
  1089. C    ASK FOR 1 GIN INPUT
  1090. C
  1091. C
  1092.     CALL GB_GIN(PROMPT,27,.FALSE.,GINBUFR)
  1093. C
  1094. C    GET THE KEY, X POSITION, AND Y POSITION
  1095. C
  1096. C
  1097.     IPTR = 0
  1098. 910    IPTR = IPTR + 1
  1099.     IF (GINBUFR(IPTR) .NE. PLUS_SIGN) GO TO 910
  1100.     DECODE (17,911,GINBUFR(IPTR)) IX, IY, ICHAR
  1101. 911    FORMAT(I6,1X,I6,1X,I3)
  1102.     XA(1) = ICHAR    !PICK CHARACTER
  1103.     XA(2) = FLOAT(IX)/XGUPCM    !X IN CM.
  1104.     XA(3) = FLOAT(IY)/YGUPCM    !Y IN CM.
  1105.     GO TO 290
  1106.     END
  1107.     SUBROUTINE GD26CONVERT(IX,IY)
  1108. C
  1109. C    THIS SUBROUTINE CONVERTS THE POINT (IX,IY) INTO THE 4010 SCHEME
  1110. C    OF ENCODING COORDINATES
  1111. C
  1112.     CALL GB_INSERT(32+IX/32)
  1113.     CALL GB_INSERT(32+IAND(IX,31))
  1114.     CALL GB_INSERT(32+IY/32)
  1115.     CALL GB_INSERT(32+IAND(IY,31))
  1116.     RETURN
  1117.     END
  1118.     SUBROUTINE GD4010(IFXN,XA,YA)
  1119.     DIMENSION XA(8), YA(3)
  1120. C
  1121. C    TEK 4010 DRIVER FOR DIGLIB/VAX
  1122. C
  1123. C-----------------------------------------------------------------------
  1124. C
  1125.     BYTE ESC, CSUB, GS, US, CR, FF
  1126.     PARAMETER (ESC=27, CSUB=26, GS=29, US=31, CR=13, FF=12)
  1127.     CHARACTER*(*) TERMINAL
  1128.     PARAMETER (TERMINAL='TT')
  1129. C
  1130. C    DEFINITIONS FOR DEVICE CONTROL
  1131. C
  1132.     BYTE STR_END(2)
  1133.     BYTE STR_BEGIN_PLOT(4)
  1134.     DATA STR_END /US,0/
  1135.     DATA STR_BEGIN_PLOT /ESC,FF,2*0/
  1136.  
  1137. C    DEFINITIONS FOR GIN
  1138. C
  1139.     BYTE GINBUFR(8), PROMPT(4)
  1140.     DATA PROMPT /ESC, CSUB, 2*0/
  1141.     DATA IGIN_IN_CHARS /5/
  1142. C
  1143. C    DECLARE BUFFERING FUNCTION
  1144. C
  1145.     LOGICAL GB_TEST_FLUSH
  1146. C
  1147. C    DECLARE VARS NEED FOR DRIVER OPERATION
  1148. C
  1149.     LOGICAL LVECTOR_GOING, LDUMMY
  1150.     DIMENSION DCHAR(8)
  1151. C
  1152. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  1153. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  1154. C
  1155.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  1156.     DATA DCHAR /4010.0, 21.492, 16.114, 47.6, 47.6, 1.0, 130.0, 1.0/
  1157. C
  1158. C*****************
  1159. C
  1160. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  1161. C
  1162.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  1163. C
  1164. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  1165. C
  1166.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  1167. C
  1168. C    *********************
  1169. C    INITIALIZE THE DEVICE
  1170. C    *********************
  1171. C
  1172. 100    CONTINUE
  1173. C
  1174. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  1175. C
  1176.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  1177.     YA(1) = IERR
  1178.     LVECTOR_GOING = .FALSE.
  1179.     RETURN
  1180. C
  1181. C    **************************
  1182. C    GET FRESH PLOTTING SURFACE
  1183. C    **************************
  1184. C
  1185. 200    CONTINUE
  1186.     CALL GB_NEW_BUFFER
  1187.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1188.     CALL GB_EMPTY
  1189.     CALL GDWAIT(2000)
  1190.     LVECTOR_GOING = .FALSE.
  1191.     RETURN
  1192. C
  1193. C    ****
  1194. C    MOVE
  1195. C    ****
  1196. C
  1197. 300    CONTINUE
  1198. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  1199.     IXPOSN = XGUPCM*XA(1)+0.5
  1200.     IYPOSN = YGUPCM*YA(1)+0.5
  1201.     LVECTOR_GOING = .FALSE.
  1202.     RETURN
  1203. C
  1204. C    ****
  1205. C    DRAW
  1206. C    ****
  1207. C
  1208. 400    CONTINUE
  1209.     IX = XGUPCM*XA(1)+0.5
  1210.     IY = YGUPCM*YA(1)+0.5
  1211.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  1212.     IF (LVECTOR_GOING) GO TO 410
  1213.     LDUMMY = GB_TEST_FLUSH(9)
  1214.     LVECTOR_GOING = .TRUE.
  1215.     CALL GB_INSERT(GS)
  1216.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  1217. 410    CALL GD_4010_CONVERT(IX,IY)
  1218.     IXPOSN = IX
  1219.     IYPOSN = IY
  1220.     RETURN
  1221. C
  1222. C    *****************************
  1223. C    FLUSH GRAPHICS COMMAND BUFFER
  1224. C    *****************************
  1225. C
  1226. 500    CONTINUE
  1227.     CALL GB_EMPTY
  1228.     CALL GB_INSERT(GS)
  1229.     CALL GD_4010_CONVERT(0,1020)
  1230.     CALL GB_EMPTY
  1231.     LVECTOR_GOING = .FALSE.
  1232.     RETURN
  1233. C
  1234. C    ******************
  1235. C    RELEASE THE DEVICE
  1236. C    ******************
  1237. C
  1238. 600    CONTINUE
  1239. C
  1240. C    DE-ASSIGN THE CHANNAL
  1241. C
  1242.     CALL GB_FINISH(0)
  1243.     RETURN
  1244. C
  1245. C    *****************************
  1246. C    RETURN DEVICE CHARACTERISTICS
  1247. C    *****************************
  1248. C
  1249. 700    CONTINUE
  1250.     DO 720 I=1,8
  1251.     XA(I) = DCHAR(I)
  1252. 720    CONTINUE
  1253.     RETURN
  1254. C
  1255. C    ****************************
  1256. C    SELECT CURRENT DRAWING COLOR
  1257. C    ****************************
  1258. C
  1259. 800    CONTINUE
  1260.     RETURN
  1261. C
  1262. C    **********************
  1263. C    PERFORM GRAPHICS INPUT
  1264. C    **********************
  1265. C
  1266. 900    CONTINUE
  1267.     CALL GB_EMPTY
  1268.     LVECTOR_GOING = .FALSE.
  1269. C
  1270. C    ASK FOR 1 GIN INPUT
  1271. C
  1272. C
  1273.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  1274. C
  1275.     ICHAR = GINBUFR(1)
  1276.     IX1 = GINBUFR(2)
  1277.     IX2 = GINBUFR(3)
  1278.     IY1 = GINBUFR(4)
  1279.     IY2 = GINBUFR(5)
  1280. C
  1281.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  1282.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  1283.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  1284. C
  1285.     RETURN
  1286.     END
  1287.     SUBROUTINE GD_4010_CONVERT(IX,IY)
  1288. C
  1289. C    THIS SUBROUTINE CONVERTS THE POINT (IX,IY) INTO THE 4010 SCHEME
  1290. C    OF ENCODING COORDINATES
  1291. C
  1292.     CALL GB_INSERT(32+IY/32)
  1293.     CALL GB_INSERT(96+IAND(IY,31))
  1294.     CALL GB_INSERT(32+IX/32)
  1295.     CALL GB_INSERT(64+IAND(IX,31))
  1296.     RETURN
  1297.     END
  1298.     SUBROUTINE GD_4010_CONVERT(IX,IY)
  1299. C
  1300. C    THIS SUBROUTINE CONVERTS THE POINT (IX,IY) INTO THE 4010 SCHEME
  1301. C    OF ENCODING COORDINATES
  1302. C
  1303.     CALL GB_INSERT(32+IY/32)
  1304.     CALL GB_INSERT(96+IAND(IY,31))
  1305.     CALL GB_INSERT(32+IX/32)
  1306.     CALL GB_INSERT(64+IAND(IX,31))
  1307.     RETURN
  1308.     END
  1309.     SUBROUTINE GD4012(IFXN,XA,YA)
  1310.     DIMENSION XA(8), YA(3)
  1311. C
  1312. C    TEK 4012 DRIVER FOR DIGLIB/VAX
  1313. C
  1314. C-----------------------------------------------------------------------
  1315. C
  1316.     BYTE ESC, CSUB, GS, US, CR, FF
  1317.     PARAMETER (ESC=27, CSUB=26, GS=29, US=31, CR=13, FF=12)
  1318.     CHARACTER*(*) TERMINAL
  1319.     PARAMETER (TERMINAL='TT')
  1320. C
  1321. C    DEFINITIONS FOR DEVICE CONTROL
  1322. C
  1323.     BYTE STR_END(2)
  1324.     BYTE STR_BEGIN_PLOT(4)
  1325.     DATA STR_END /US,0/
  1326.     DATA STR_BEGIN_PLOT /ESC,FF,2*0/
  1327.  
  1328. C    DEFINITIONS FOR GIN
  1329. C
  1330.     BYTE GINBUFR(8), PROMPT(4)
  1331.     DATA PROMPT /ESC, CSUB, 2*0/
  1332.     DATA IGIN_IN_CHARS /5/
  1333. C
  1334. C    DECLARE BUFFERING FUNCTION
  1335. C
  1336.     LOGICAL GB_TEST_FLUSH
  1337. C
  1338. C    DECLARE VARS NEED FOR DRIVER OPERATION
  1339. C
  1340.     LOGICAL LVECTOR_GOING, LDUMMY
  1341.     DIMENSION DCHAR(8)
  1342. C
  1343. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  1344. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  1345. C
  1346.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  1347.     DATA DCHAR /4012.0, 20.02, 15.01, 51.1, 51.1, 1.0, 130.0, 1.0/
  1348. C
  1349. C*****************
  1350. C
  1351. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  1352. C
  1353.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  1354. C
  1355. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  1356. C
  1357.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  1358. C
  1359. C    *********************
  1360. C    INITIALIZE THE DEVICE
  1361. C    *********************
  1362. C
  1363. 100    CONTINUE
  1364. C
  1365. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  1366. C
  1367.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  1368.     YA(1) = IERR
  1369.     LVECTOR_GOING = .FALSE.
  1370.     RETURN
  1371. C
  1372. C    **************************
  1373. C    GET FRESH PLOTTING SURFACE
  1374. C    **************************
  1375. C
  1376. 200    CONTINUE
  1377.     CALL GB_NEW_BUFFER
  1378.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1379.     CALL GB_EMPTY
  1380.     CALL GDWAIT(2000)
  1381.     LVECTOR_GOING = .FALSE.
  1382.     RETURN
  1383. C
  1384. C    ****
  1385. C    MOVE
  1386. C    ****
  1387. C
  1388. 300    CONTINUE
  1389. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  1390.     IXPOSN = XGUPCM*XA(1)+0.5
  1391.     IYPOSN = YGUPCM*YA(1)+0.5
  1392.     LVECTOR_GOING = .FALSE.
  1393.     RETURN
  1394. C
  1395. C    ****
  1396. C    DRAW
  1397. C    ****
  1398. C
  1399. 400    CONTINUE
  1400.     IX = XGUPCM*XA(1)+0.5
  1401.     IY = YGUPCM*YA(1)+0.5
  1402.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  1403.     IF (LVECTOR_GOING) GO TO 410
  1404.     LDUMMY = GB_TEST_FLUSH(9)
  1405.     LVECTOR_GOING = .TRUE.
  1406.     CALL GB_INSERT(GS)
  1407.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  1408. 410    CALL GD_4010_CONVERT(IX,IY)
  1409.     IXPOSN = IX
  1410.     IYPOSN = IY
  1411.     RETURN
  1412. C
  1413. C    *****************************
  1414. C    FLUSH GRAPHICS COMMAND BUFFER
  1415. C    *****************************
  1416. C
  1417. 500    CONTINUE
  1418.     CALL GB_EMPTY
  1419.     CALL GB_INSERT(GS)
  1420.     CALL GD_4010_CONVERT(0,1020)
  1421.     CALL GB_EMPTY
  1422.     LVECTOR_GOING = .FALSE.
  1423.     RETURN
  1424. C
  1425. C    ******************
  1426. C    RELEASE THE DEVICE
  1427. C    ******************
  1428. C
  1429. 600    CONTINUE
  1430. C
  1431. C    DE-ASSIGN THE CHANNAL
  1432. C
  1433.     CALL GB_FINISH(0)
  1434.     RETURN
  1435. C
  1436. C    *****************************
  1437. C    RETURN DEVICE CHARACTERISTICS
  1438. C    *****************************
  1439. C
  1440. 700    CONTINUE
  1441.     DO 720 I=1,8
  1442.     XA(I) = DCHAR(I)
  1443. 720    CONTINUE
  1444.     RETURN
  1445. C
  1446. C    ****************************
  1447. C    SELECT CURRENT DRAWING COLOR
  1448. C    ****************************
  1449. C
  1450. 800    CONTINUE
  1451.     RETURN
  1452. C
  1453. C    **********************
  1454. C    PERFORM GRAPHICS INPUT
  1455. C    **********************
  1456. C
  1457. 900    CONTINUE
  1458.     CALL GB_EMPTY
  1459.     LVECTOR_GOING = .FALSE.
  1460. C
  1461. C    ASK FOR 1 GIN INPUT
  1462. C
  1463. C
  1464.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  1465. C
  1466.     ICHAR = GINBUFR(1)
  1467.     IX1 = GINBUFR(2)
  1468.     IX2 = GINBUFR(3)
  1469.     IY1 = GINBUFR(4)
  1470.     IY2 = GINBUFR(5)
  1471. C
  1472.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  1473.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  1474.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  1475. C
  1476.     RETURN
  1477.     END
  1478.     SUBROUTINE GD4014(IFXN,XA,YA)
  1479.     DIMENSION XA(8), YA(3)
  1480. C
  1481. C    TEK 4014 DRIVER FOR DIGLIB/VAX
  1482. C
  1483. C-----------------------------------------------------------------------
  1484. C
  1485.     BYTE ESC, CSUB, GS, US, CR, FF
  1486.     PARAMETER (ESC=27, CSUB=26, GS=29, US=31, CR=13, FF=12)
  1487.     CHARACTER*(*) TERMINAL
  1488.     PARAMETER (TERMINAL='TT')
  1489. C
  1490. C    DEFINITIONS FOR DEVICE CONTROL
  1491. C
  1492.     BYTE STR_END(2)
  1493.     BYTE STR_BEGIN_PLOT(4)
  1494.     DATA STR_END /US,0/
  1495.     DATA STR_BEGIN_PLOT /ESC,FF,2*0/
  1496.  
  1497. C    DEFINITIONS FOR GIN
  1498. C
  1499.     BYTE GINBUFR(8), PROMPT(4)
  1500.     DATA PROMPT /ESC, CSUB, 2*0/
  1501.     DATA IGIN_IN_CHARS /5/
  1502. C
  1503. C    DECLARE BUFFERING FUNCTION
  1504. C
  1505.     LOGICAL GB_TEST_FLUSH
  1506. C
  1507. C    DECLARE VARS NEED FOR DRIVER OPERATION
  1508. C
  1509.     LOGICAL LVECTOR_GOING, LDUMMY
  1510.     DIMENSION DCHAR(8)
  1511. C
  1512. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  1513. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  1514. C
  1515.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  1516.     DATA DCHAR /4014.0, 36.212, 27.15, 28.25, 28.25, 1.0, 130.0, 1.0/
  1517. C
  1518. C*****************
  1519. C
  1520. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  1521. C
  1522.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  1523. C
  1524. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  1525. C
  1526.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  1527. C
  1528. C    *********************
  1529. C    INITIALIZE THE DEVICE
  1530. C    *********************
  1531. C
  1532. 100    CONTINUE
  1533. C
  1534. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  1535. C
  1536.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  1537.     LVECTOR_GOING = .FALSE.
  1538.     YA(1) = IERR
  1539.     RETURN
  1540. C
  1541. C    **************************
  1542. C    GET FRESH PLOTTING SURFACE
  1543. C    **************************
  1544. C
  1545. 200    CONTINUE
  1546.     CALL GB_NEW_BUFFER
  1547.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1548.     CALL GB_EMPTY
  1549.     CALL GDWAIT(2000)
  1550.     LVECTOR_GOING = .FALSE.
  1551.     RETURN
  1552. C
  1553. C    ****
  1554. C    MOVE
  1555. C    ****
  1556. C
  1557. 300    CONTINUE
  1558. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  1559.     IXPOSN = XGUPCM*XA(1)+0.5
  1560.     IYPOSN = YGUPCM*YA(1)+0.5
  1561.     LVECTOR_GOING = .FALSE.
  1562.     RETURN
  1563. C
  1564. C    ****
  1565. C    DRAW
  1566. C    ****
  1567. C
  1568. 400    CONTINUE
  1569.     IX = XGUPCM*XA(1)+0.5
  1570.     IY = YGUPCM*YA(1)+0.5
  1571.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  1572.     IF (LVECTOR_GOING) GO TO 410
  1573.     LDUMMY = GB_TEST_FLUSH(9)
  1574.     LVECTOR_GOING = .TRUE.
  1575.     CALL GB_INSERT(GS)
  1576.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  1577. 410    CALL GD_4010_CONVERT(IX,IY)
  1578.     IXPOSN = IX
  1579.     IYPOSN = IY
  1580.     RETURN
  1581. C
  1582. C    *****************************
  1583. C    FLUSH GRAPHICS COMMAND BUFFER
  1584. C    *****************************
  1585. C
  1586. 500    CONTINUE
  1587.     CALL GB_EMPTY
  1588.     CALL GB_INSERT(GS)
  1589.     CALL GD_4010_CONVERT(0,1020)
  1590.     CALL GB_EMPTY
  1591.     LVECTOR_GOING = .FALSE.
  1592.     RETURN
  1593. C
  1594. C    ******************
  1595. C    RELEASE THE DEVICE
  1596. C    ******************
  1597. C
  1598. 600    CONTINUE
  1599. C
  1600. C    DE-ASSIGN THE CHANNAL
  1601. C
  1602.     CALL GB_FINISH(0)
  1603.     RETURN
  1604. C
  1605. C    *****************************
  1606. C    RETURN DEVICE CHARACTERISTICS
  1607. C    *****************************
  1608. C
  1609. 700    CONTINUE
  1610.     DO 720 I=1,8
  1611.     XA(I) = DCHAR(I)
  1612. 720    CONTINUE
  1613.     RETURN
  1614. C
  1615. C    ****************************
  1616. C    SELECT CURRENT DRAWING COLOR
  1617. C    ****************************
  1618. C
  1619. 800    CONTINUE
  1620.     RETURN
  1621. C
  1622. C    **********************
  1623. C    PERFORM GRAPHICS INPUT
  1624. C    **********************
  1625. C
  1626. 900    CONTINUE
  1627.     CALL GB_EMPTY
  1628.     LVECTOR_GOING = .FALSE.
  1629. C
  1630. C    ASK FOR 1 GIN INPUT
  1631. C
  1632. C
  1633.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  1634. C
  1635.     ICHAR = GINBUFR(1)
  1636.     IX1 = GINBUFR(2)
  1637.     IX2 = GINBUFR(3)
  1638.     IY1 = GINBUFR(4)
  1639.     IY2 = GINBUFR(5)
  1640. C
  1641.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  1642.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  1643.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  1644. C
  1645.     RETURN
  1646.     END
  1647.     SUBROUTINE GD_4014_CONVERT(IX,IY)
  1648. C
  1649. C    CONVERTS (IX,IY) TO THE 4014 12-BIT FORMAT AND PLACES THE
  1650. C    CHARACTERS INTO THE BUFFER.   OPTIMIZED FOR MINIMUM CHARS TO BE
  1651. C    TRANSMITTED.
  1652. C
  1653.     COMMON /GD_4014_STATE_MEM/ IOLD_HIY, IOLD_EX, IOLD_LOY, IOLD_HIX
  1654.     DATA IOLD_HIY, IOLD_EX, IOLD_LOY, IOLD_HIX /4*-1/
  1655.     IHIY = 32+IY/128
  1656.     IEX = 96+4*IAND(IY,3)+IAND(IX,3)
  1657.     ILOY = 96+IAND(IY/4,31)
  1658.     IHIX = 32+IX/128
  1659. C
  1660. C    HI-Y ONLY NEEDS BE SENT WHEN IT CHANGES
  1661. C
  1662.     IF (IHIY .NE. IOLD_HIY) THEN
  1663.         IOLD_HIY = IHIY
  1664.         CALL GB_INSERT(IHIY)
  1665.     ENDIF
  1666. C
  1667. C    EXTRA-BITS ONLY NEEDS BE SENT WHEN IT CHANGES, BUT IF SENT, THEN
  1668. C    LO-Y MUST BE SENT EVEN IF IT DIDN'T CHANGE.
  1669. C
  1670.     IF (IEX .NE. IOLD_EX) THEN
  1671.         IOLD_EX = IEX
  1672.         CALL GB_INSERT(IEX)
  1673.         CALL GB_INSERT(ILOY)
  1674.         IOLD_LOY = ILOY
  1675.         ELSE
  1676. C
  1677. C        SEND LO-Y IF IT CHANGED OR IF WE NEED TO SEND A HI-X
  1678. C
  1679.         IF (ILOY .NE. IOLD_LOY .OR.
  1680.     1       IHIX .NE. IOLD_HIX) THEN
  1681.             IOLD_LOY = ILOY
  1682.             CALL GB_INSERT(ILOY)
  1683.         ENDIF
  1684.     ENDIF
  1685. C
  1686. C    HI-X CAN ONLY BE SENT IF PRECEEDED BY LO-Y --> THIS IS HANDLED
  1687. C    PREVIOUSLY.
  1688. C
  1689.     IF (IHIX .NE. IOLD_HIX) THEN
  1690.         IOLD_HIX = IHIX
  1691.         CALL GB_INSERT(IHIX)
  1692.     ENDIF
  1693. C
  1694. C    LO-X MUST ALWAYS BE SENT
  1695. C
  1696.     CALL GB_INSERT(64+IAND(IX/4,31))
  1697.     RETURN
  1698.     END
  1699.  
  1700.     SUBROUTINE GD_4014_ZORCH
  1701.     COMMON /GD_4014_STATE_MEM/ IOLD_HIY, IOLD_EX, IOLD_LOY, IOLD_HIX
  1702.     IOLD_HIY = -1
  1703.     IOLD_EX = -1
  1704.     IOLD_LOY = -1
  1705.     IOLD_HIX = -1
  1706.     RETURN
  1707.     END
  1708.     SUBROUTINE GD4014REM(IFXN,XA,YA)
  1709.     DIMENSION XA(8), YA(3)
  1710. C
  1711. C    REMOTE (OTHER TT LINE) TEK 4014 DRIVER FOR DIGLIB/VAX
  1712. C
  1713. C-----------------------------------------------------------------------
  1714. C
  1715.     BYTE ESC, CSUB, GS, US, CR, FF
  1716.     PARAMETER (ESC=27, CSUB=26, GS=29, US=31, CR=13, FF=12)
  1717.     CHARACTER*(*) TERMINAL
  1718.     PARAMETER (TERMINAL='DIG_4014_TTY')
  1719. C
  1720. C    DEFINITIONS FOR DEVICE CONTROL
  1721. C
  1722.     BYTE STR_END(2)
  1723.     BYTE STR_BEGIN_PLOT(4)
  1724.     DATA STR_END /US,0/
  1725.     DATA STR_BEGIN_PLOT /ESC,FF,2*0/
  1726.  
  1727. C    DEFINITIONS FOR GIN
  1728. C
  1729.     BYTE GINBUFR(8), PROMPT(4)
  1730.     DATA PROMPT /ESC, CSUB, 2*0/
  1731.     DATA IGIN_IN_CHARS /5/
  1732. C
  1733. C    DECLARE BUFFERING FUNCTION
  1734. C
  1735.     LOGICAL GB_TEST_FLUSH
  1736. C
  1737. C    DECLARE VARS NEED FOR DRIVER OPERATION
  1738. C
  1739.     LOGICAL LVECTOR_GOING, LDUMMY
  1740.     DIMENSION DCHAR(8)
  1741. C
  1742. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  1743. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  1744. C
  1745.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  1746.     DATA DCHAR /4014.0, 36.212, 27.15, 28.25, 28.25, 1.0, 146.0, 1.0/
  1747. C
  1748. C*****************
  1749. C
  1750. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  1751. C
  1752.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  1753. C
  1754. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  1755. C
  1756.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  1757. C
  1758. C    *********************
  1759. C    INITIALIZE THE DEVICE
  1760. C    *********************
  1761. C
  1762. 100    CONTINUE
  1763. C
  1764. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  1765. C
  1766.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  1767.     YA(1) = IERR
  1768.     LVECTOR_GOING = .FALSE.
  1769.     RETURN
  1770. C
  1771. C    **************************
  1772. C    GET FRESH PLOTTING SURFACE
  1773. C    **************************
  1774. C
  1775. 200    CONTINUE
  1776.     CALL GB_NEW_BUFFER
  1777.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1778.     CALL GB_EMPTY
  1779.     CALL GDWAIT(2000)
  1780.     LVECTOR_GOING = .FALSE.
  1781.     RETURN
  1782. C
  1783. C    ****
  1784. C    MOVE
  1785. C    ****
  1786. C
  1787. 300    CONTINUE
  1788. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  1789.     IXPOSN = XGUPCM*XA(1)+0.5
  1790.     IYPOSN = YGUPCM*YA(1)+0.5
  1791.     LVECTOR_GOING = .FALSE.
  1792.     RETURN
  1793. C
  1794. C    ****
  1795. C    DRAW
  1796. C    ****
  1797. C
  1798. 400    CONTINUE
  1799.     IX = XGUPCM*XA(1)+0.5
  1800.     IY = YGUPCM*YA(1)+0.5
  1801.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  1802.     IF (LVECTOR_GOING) GO TO 410
  1803.     LDUMMY = GB_TEST_FLUSH(9)
  1804.     LVECTOR_GOING = .TRUE.
  1805.     CALL GB_INSERT(GS)
  1806.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  1807. 410    CALL GD_4010_CONVERT(IX,IY)
  1808.     IXPOSN = IX
  1809.     IYPOSN = IY
  1810.     RETURN
  1811. C
  1812. C    *****************************
  1813. C    FLUSH GRAPHICS COMMAND BUFFER
  1814. C    *****************************
  1815. C
  1816. 500    CONTINUE
  1817.     CALL GB_EMPTY
  1818.     CALL GB_INSERT(GS)
  1819.     CALL GD_4010_CONVERT(0,50)
  1820.     CALL GB_EMPTY
  1821.     LVECTOR_GOING = .FALSE.
  1822.     RETURN
  1823. C
  1824. C    ******************
  1825. C    RELEASE THE DEVICE
  1826. C    ******************
  1827. C
  1828. 600    CONTINUE
  1829. C
  1830. C    DE-ASSIGN THE CHANNAL
  1831. C
  1832.     CALL GB_FINISH(0)
  1833.     RETURN
  1834. C
  1835. C    *****************************
  1836. C    RETURN DEVICE CHARACTERISTICS
  1837. C    *****************************
  1838. C
  1839. 700    CONTINUE
  1840.     DO 720 I=1,8
  1841.     XA(I) = DCHAR(I)
  1842. 720    CONTINUE
  1843.     RETURN
  1844. C
  1845. C    ****************************
  1846. C    SELECT CURRENT DRAWING COLOR
  1847. C    ****************************
  1848. C
  1849. 800    CONTINUE
  1850.     RETURN
  1851. C
  1852. C    **********************
  1853. C    PERFORM GRAPHICS INPUT
  1854. C    **********************
  1855. C
  1856. 900    CONTINUE
  1857.     CALL GB_EMPTY
  1858.     LVECTOR_GOING = .FALSE.
  1859. C
  1860. C    ASK FOR 1 GIN INPUT
  1861. C
  1862. C
  1863.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  1864. C
  1865.     ICHAR = GINBUFR(1)
  1866.     IX1 = GINBUFR(2)
  1867.     IX2 = GINBUFR(3)
  1868.     IY1 = GINBUFR(4)
  1869.     IY2 = GINBUFR(5)
  1870. C
  1871.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  1872.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  1873.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  1874. C
  1875.     RETURN
  1876.     END
  1877.     SUBROUTINE GD4025(IFXN,XA,YA)
  1878.     DIMENSION XA(8), YA(3)
  1879. C
  1880. C    TEKTRONIX 4025 DRIVER FOR DIGLIB/VAX
  1881. C
  1882. C-----------------------------------------------------------------------
  1883. C
  1884.     BYTE CMD, CSUB, US, GS, CR, FF
  1885.     PARAMETER (CMD=33, CSUB=26, US=31, GS=29, CR=13, FF=12)
  1886.     CHARACTER*(*) TERMINAL
  1887.     PARAMETER (TERMINAL='TT')
  1888. C
  1889. C    DEFINITIONS FOR DEVICE CONTROL
  1890. C
  1891.     BYTE STR_END(2), STR_BEGIN_PLOT(14), STR_COLOR_SET(8)
  1892.     BYTE STR_INIT_4025(32)
  1893.     BYTE ASCIID, ASCIIA, ASCIIT
  1894. C
  1895.     DATA ASCIID, ASCIIA, ASCIIT /'D','A','T'/
  1896.     DATA STR_END /13,0/
  1897.     DATA STR_INIT_4025 /
  1898.     1   CMD,'W','O','R',' ','3','0',
  1899.     2   CMD,'G','R','A',' ','1',',','3','0',
  1900.     3   CMD,'J','U','M',' ','1',',','1',
  1901.     4   CMD,'L','I','N',' ','1',2*0/
  1902.     DATA STR_BEGIN_PLOT /
  1903.     1   CMD,'E','R','A',' ','G',
  1904.     2   CMD,'L','I','N',' ','1',2*0/
  1905.     DATA STR_COLOR_SET /
  1906.     1   CMD,'L','I','N',' ','1',2*0/
  1907. C
  1908. C    DEFINITIONS FOR GIN
  1909. C
  1910.     BYTE GINBUFR(28), PROMPT(8)
  1911. C
  1912.     DATA PROMPT /
  1913.     1   CMD,'E','N','A',' ','1',CR,0/
  1914.     DATA IGIN_IN_CHARS /27/
  1915. C
  1916. C    DECLARE BUFFERING FUNCTION
  1917. C
  1918.     LOGICAL GB_TEST_FLUSH
  1919. C
  1920. C    DECLARE VARS NEED FOR DRIVER OPERATION
  1921. C
  1922.     LOGICAL LVECTOR_GOING, LDUMMY
  1923.     DIMENSION DCHAR(8)
  1924. C
  1925. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  1926. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  1927. C
  1928.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  1929.     DATA DCHAR /4025.0, 21.69, 14.223, 29.46, 29.46, 1.0, 133.0, 1.0/
  1930. C
  1931. C*****************
  1932. C
  1933. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  1934. C
  1935.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  1936. C
  1937. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  1938. C
  1939.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  1940. C
  1941. C    *********************
  1942. C    INITIALIZE THE DEVICE
  1943. C    *********************
  1944. C
  1945. 100    CONTINUE
  1946. C
  1947. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  1948. C
  1949.     CALL GB_INITIALIZE(US,STR_END,TERMINAL,IERR)
  1950.     YA(1) = IERR
  1951.     IF (IERR .NE. 0) RETURN
  1952.     LVECTOR_GOING = .FALSE.
  1953. C
  1954. C    CREATE WORKSPACE AND GRAPHICS AREA
  1955. C
  1956.     CALL GB_IN_STRING(STR_INIT_4025)
  1957.     CALL GB_EMPTY
  1958.     RETURN
  1959. C
  1960. C    **************************
  1961. C    GET FRESH PLOTTING SURFACE
  1962. C    **************************
  1963. C
  1964. 200    CONTINUE
  1965.     CALL GB_NEW_BUFFER
  1966.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  1967.     CALL GB_EMPTY
  1968.     LVECTOR_GOING = .FALSE.
  1969.     RETURN
  1970. C
  1971. C    ****
  1972. C    MOVE
  1973. C    ****
  1974. C
  1975. 300    CONTINUE
  1976. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  1977.     IXPOSN = XGUPCM*XA(1)+0.5
  1978.     IYPOSN = YGUPCM*YA(1)+0.5
  1979.     LVECTOR_GOING = .FALSE.
  1980.     RETURN
  1981. C
  1982. C    ****
  1983. C    DRAW
  1984. C    ****
  1985. C
  1986. 400    CONTINUE
  1987.     IX = XGUPCM*XA(1)+0.5
  1988.     IY = YGUPCM*YA(1)+0.5
  1989.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  1990.     IF (LVECTOR_GOING) GO TO 410
  1991.     LDUMMY = GB_TEST_FLUSH(9)
  1992.     LVECTOR_GOING =  .TRUE.
  1993.     CALL GB_INSERT(GS)
  1994.     CALL GB_USE_TERMINATOR
  1995.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  1996. 410    CALL GD_4010_CONVERT(IX,IY)
  1997.     IXPOSN = IX
  1998.     IYPOSN = IY
  1999.     RETURN
  2000. C
  2001. C    *****************************
  2002. C    FLUSH GRAPHICS COMMAND BUFFER
  2003. C    *****************************
  2004. C
  2005. 500    CONTINUE
  2006.     CALL GB_EMPTY
  2007.     LVECTOR_GOING = .FALSE.
  2008.     RETURN
  2009. C
  2010. C    ******************
  2011. C    RELEASE THE DEVICE
  2012. C    ******************
  2013. C
  2014. 600    CONTINUE
  2015. C
  2016. C    DO NOTHING - LET USER KILL PICTURE
  2017. C
  2018.     CALL GB_EMPTY
  2019.     RETURN
  2020. C
  2021. C    *****************************
  2022. C    RETURN DEVICE CHARACTERISTICS
  2023. C    *****************************
  2024. C
  2025. 700    CONTINUE
  2026.     DO 720 I=1,8
  2027.     XA(I) = DCHAR(I)
  2028. 720    CONTINUE
  2029.     RETURN
  2030. C
  2031. C    ****************************
  2032. C    SELECT CURRENT DRAWING COLOR
  2033. C    ****************************
  2034. C
  2035. 800    CONTINUE
  2036.     CALL GB_EMPTY
  2037.     ICOLOR = XA(1)
  2038.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  2039.     IF (ICOLOR .EQ. 1) THEN
  2040.         STR_COLOR_SET(6) = 49
  2041.         ELSE
  2042.         STR_COLOR_SET(6) = 69
  2043.         ENDIF
  2044.     CALL GB_IN_STRING(STR_COLOR_SET)
  2045.     LVECTOR_GOING = .FALSE.
  2046.     RETURN
  2047. C
  2048. C    **********************
  2049. C    PERFORM GRAPHICS INPUT
  2050. C    **********************
  2051. C
  2052. 900    CONTINUE
  2053.     CALL GB_EMPTY
  2054.     LVECTOR_GOING = .FALSE.
  2055. C
  2056. C    ASK FOR 1 GIN INPUT
  2057. C
  2058. C
  2059. 920    CONTINUE
  2060.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.FALSE.,GINBUFR)
  2061.     IF ((GINBUFR(2) .NE. ASCIID) .OR. (GINBUFR(3) .NE. ASCIIA) .OR.
  2062.     1   (GINBUFR(4) .NE. ASCIIT)) GOTO 920
  2063. C
  2064. C    GET KEY PRESSED, X AND Y
  2065. C
  2066. C    KEY IS AT 9, X IS AT 13, AND Y IS AT 17
  2067. C
  2068.     DECODE (11,911,GINBUFR(9)) XA(1), XA(2), XA(3)
  2069. 911    FORMAT(F3.0,1X,F3.0,1X,F3.0)
  2070.     XA(2) = XA(2)/XGUPCM
  2071.     XA(3) = XA(3)/YGUPCM
  2072.     RETURN
  2073.     END
  2074.     SUBROUTINE GD4027(IFXN,XA,YA)
  2075.     DIMENSION XA(8), YA(3)
  2076. C
  2077. C    TEKTRONIX 4027 DRIVER FOR DIGLIB/VAX
  2078. C        UNTESTED but derived from the 4025 driver, so it should
  2079. C            mostly work
  2080. C
  2081. C-----------------------------------------------------------------------
  2082. C
  2083.     BYTE CSUB, US, GS, CR, FF, ESC
  2084.     PARAMETER (CSUB=26, US=31, GS=29, CR=13, FF=12, ESC=27)
  2085.     CHARACTER*(*) TERMINAL, LOG_CC, LOG_COM
  2086.     PARAMETER (TERMINAL='TT')
  2087.     PARAMETER (LOG_CC='TEK_4025CC')
  2088.     PARAMETER (LOG_COM = 'TEK_4025COM')
  2089. C
  2090. C    DEFINITIONS FOR DEVICE CONTROL
  2091. C
  2092.     CHARACTER*1 NEW_CC
  2093.     CHARACTER*80 NEW_COM
  2094.     BYTE CMD, BCHAR
  2095.     BYTE STR_END(2)
  2096.     BYTE ASCIID, ASCIIA, ASCIIT
  2097.     BYTE BCOLOR_MAP(8)
  2098. C
  2099.     DATA CMD /33/
  2100.     DATA ASCIID, ASCIIA, ASCIIT /'D','A','T'/
  2101.     DATA STR_END /13,0/
  2102.     DATA BCOLOR_MAP / '7', '0', '1', '2', '3', '4', '5', '6' /
  2103. C
  2104. C    DEFINITIONS FOR GIN
  2105. C
  2106.     BYTE GINBUFR(28), PROMPT(8)
  2107. C
  2108.     DATA PROMPT /
  2109.     1   0,'E','N','A',' ','1',CR,0/
  2110.     DATA IGIN_IN_CHARS /27/
  2111. C
  2112. C    DECLARE BUFFERING FUNCTION
  2113. C
  2114.     LOGICAL GB_TEST_FLUSH
  2115. C
  2116. C    DECLARE VARS NEED FOR DRIVER OPERATION
  2117. C
  2118.     INTEGER*4 SYS$TRNLOG, STR$UPCASE
  2119.     LOGICAL LVECTOR_GOING, LDUMMY
  2120.     DIMENSION DCHAR(8)
  2121. C
  2122. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  2123. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  2124. C
  2125.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  2126.     DATA DCHAR /4027.0, 24.706, 16.2, 25.864, 25.864, 7.0, 229.0, 1.0/
  2127. C
  2128. C*****************
  2129. C
  2130. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  2131. C
  2132.     IF (IFXN .LE. 0 .OR. IFXN .GT. 11) RETURN
  2133. C
  2134. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  2135. C
  2136.     GO TO (100,200,300,400,500,600,700,800,900,1000,1100) IFXN
  2137. C
  2138. C    *********************
  2139. C    INITIALIZE THE DEVICE
  2140. C    *********************
  2141. C
  2142. 100    CONTINUE
  2143. C
  2144. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  2145. C
  2146.     CALL GB_INITIALIZE(US,STR_END,TERMINAL,IERR)
  2147.     YA(1) = IERR
  2148.     IF (IERR .NE. 0) RETURN
  2149.     LVECTOR_GOING = .FALSE.
  2150. C
  2151. C    SEE IF USER DEFINED COMMAND CHARACTER
  2152. C
  2153.     ISTATUS = SYS$TRNLOG(LOG_CC,ILENCC,NEW_CC, , , )
  2154.     IF (ISTATUS) THEN
  2155.         CMD = ICHAR(NEW_CC)
  2156.     ENDIF
  2157. C
  2158. C    EXIT ANSI MODE (JUST INCASE TERMINAL IS IN ANSI MODE)
  2159. C
  2160.     CALL GB_INSERT(ESC)
  2161.     CALL GB_IN_STRING('[~')
  2162. C
  2163. C    CREATE WORKSPACE AND GRAPHICS AREA
  2164. C
  2165.     CALL GB_INSERT(CMD)
  2166.     CALL GB_IN_STRING('WOR 30')
  2167.     CALL GB_INSERT(CMD)
  2168.     CALL GB_IN_STRING('GRA 1,30')
  2169.     CALL GB_INSERT(CMD)
  2170.     CALL GB_IN_STRING('JUM 1,1')
  2171.     CALL GB_INSERT(CMD)
  2172.     CALL GB_IN_STRING('LIN 1')
  2173.     CALL GB_INSERT(CMD)
  2174.     CALL GB_IN_STRING('COL C0')
  2175.     CALL GB_EMPTY
  2176.     RETURN
  2177. C
  2178. C    **************************
  2179. C    GET FRESH PLOTTING SURFACE
  2180. C    **************************
  2181. C
  2182. 200    CONTINUE
  2183.     CALL GB_EMPTY
  2184.     CALL GB_INSERT(CMD)
  2185.     CALL GB_IN_STRING('ERA G')
  2186.     CALL GB_INSERT(CMD)
  2187.     CALL GB_IN_STRING('COL C0')
  2188.     CALL GB_EMPTY
  2189. C
  2190. C    COMMENT OUT THE FOLLOWING IF YOU DON'T WANT YOUR 4027s COLORS
  2191. C    CHANGED TO "NORMAL" BY DIGLIB
  2192. C
  2193.     CALL GD4027_MIX(CMD,0,0,0,0)
  2194.     CALL GD4027_MIX(CMD,1,100,100,100)
  2195.     CALL GD4027_MIX(CMD,2,100,0,0)
  2196.     CALL GD4027_MIX(CMD,3,0,100,0)
  2197.     CALL GB_EMPTY
  2198.     CALL GD4027_MIX(CMD,4,0,0,100)
  2199.     CALL GD4027_MIX(CMD,5,100,100,0)
  2200.     CALL GD4027_MIX(CMD,6,100,0,100)
  2201.     CALL GD4027_MIX(CMD,7,0,100,100)
  2202.     CALL GB_EMPTY
  2203.     LVECTOR_GOING = .FALSE.
  2204.     RETURN
  2205. C
  2206. C    ****
  2207. C    MOVE
  2208. C    ****
  2209. C
  2210. 300    CONTINUE
  2211. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  2212.     IXPOSN = XGUPCM*XA(1)+0.5
  2213.     IYPOSN = YGUPCM*YA(1)+0.5
  2214.     LVECTOR_GOING = .FALSE.
  2215.     RETURN
  2216. C
  2217. C    ****
  2218. C    DRAW
  2219. C    ****
  2220. C
  2221. 400    CONTINUE
  2222.     IX = XGUPCM*XA(1)+0.5
  2223.     IY = YGUPCM*YA(1)+0.5
  2224.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  2225.     IF (LVECTOR_GOING) GO TO 410
  2226.     LDUMMY = GB_TEST_FLUSH(9)
  2227.     LVECTOR_GOING =  .TRUE.
  2228.     CALL GB_INSERT(GS)
  2229.     CALL GB_USE_TERMINATOR
  2230.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  2231. 410    IF (IX .NE. IXPOSN .OR. IY .NE. IYPOSN) THEN
  2232.         CALL GD_4010_CONVERT(IX,IY)
  2233.         IXPOSN = IX
  2234.         IYPOSN = IY
  2235.     ENDIF
  2236.     RETURN
  2237. C
  2238. C    *****************************
  2239. C    FLUSH GRAPHICS COMMAND BUFFER
  2240. C    *****************************
  2241. C
  2242. 500    CONTINUE
  2243.     CALL GB_EMPTY
  2244.     LVECTOR_GOING = .FALSE.
  2245.     RETURN
  2246. C
  2247. C    ******************
  2248. C    RELEASE THE DEVICE
  2249. C    ******************
  2250. C
  2251. 600    CONTINUE
  2252. C
  2253. C    SEE IF USER WANTS ANYTHING DONE, IF SO, DO IT
  2254. C
  2255.     ISTATUS = SYS$TRNLOG(LOG_COM,ILENCOM,NEW_COM, , , )
  2256.     IF (ISTATUS) THEN
  2257.         ISTATUS = STR$UPCASE(NEW_COM,NEW_COM)
  2258.         IF (NEW_COM(1:4) .EQ. 'ANSI') THEN
  2259.             TYPE 601
  2260. 601            FORMAT('$Hit return to return terminal to ANSI mode.')
  2261.             ACCEPT 602, ISTATUS
  2262. 602            FORMAT(A1)
  2263.         ENDIF
  2264.         CALL GB_EMPTY
  2265.         CALL GB_INSERT(CMD)
  2266.         DO 610 I=1,ILENCOM
  2267.             BCHAR = ICHAR(NEW_COM(I:I))
  2268.             CALL GB_INSERT(BCHAR)
  2269. 610            CONTINUE
  2270.     ENDIF
  2271.     CALL GB_EMPTY
  2272.     RETURN
  2273. C
  2274. C    *****************************
  2275. C    RETURN DEVICE CHARACTERISTICS
  2276. C    *****************************
  2277. C
  2278. 700    CONTINUE
  2279.     DO 720 I=1,8
  2280.     XA(I) = DCHAR(I)
  2281. 720    CONTINUE
  2282.     RETURN
  2283. C
  2284. C    ****************************
  2285. C    SELECT CURRENT DRAWING COLOR
  2286. C    ****************************
  2287. C
  2288. 800    CONTINUE
  2289.     CALL GB_EMPTY
  2290.     ICOLOR = XA(1)
  2291.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 7) RETURN
  2292.     CALL GB_INSERT(CMD)
  2293.     CALL GB_IN_STRING('COL C')
  2294.     CALL GB_INSERT(BCOLOR_MAP(ICOLOR+1))
  2295.     LVECTOR_GOING = .FALSE.
  2296.     RETURN
  2297. C
  2298. C    **********************
  2299. C    PERFORM GRAPHICS INPUT
  2300. C    **********************
  2301. C
  2302. 900    CONTINUE
  2303.     CALL GB_EMPTY
  2304.     LVECTOR_GOING = .FALSE.
  2305. C
  2306. C    ASK FOR 1 GIN INPUT
  2307. C
  2308. 920    CONTINUE
  2309.     PROMPT(1) = CMD
  2310.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.FALSE.,GINBUFR)
  2311.     IF ((GINBUFR(2) .NE. ASCIID) .OR. (GINBUFR(3) .NE. ASCIIA) .OR.
  2312.     1   (GINBUFR(4) .NE. ASCIIT)) GOTO 920
  2313. C
  2314. C    GET KEY PRESSED, X AND Y
  2315. C
  2316. C    KEY IS AT 9, X IS AT 13, AND Y IS AT 17
  2317. C
  2318.     DECODE (11,911,GINBUFR(9)) XA(1), XA(2), XA(3)
  2319. 911    FORMAT(F3.0,1X,F3.0,1X,F3.0)
  2320.     XA(2) = XA(2)/XGUPCM
  2321.     XA(3) = XA(3)/YGUPCM
  2322.     RETURN
  2323. C
  2324. C    DEFINE COLOR VIA RGB
  2325. C
  2326. 1000    CONTINUE
  2327.     CALL GB_EMPTY
  2328.     LVECTOR_GOING = .FALSE.
  2329.     CALL GD4027_MIX(CMD,INT(XA(1)),INT(YA(1)),INT(YA(2)),INT(YA(3)))
  2330.     RETURN
  2331. C
  2332. C    DEFINE COLOR VIA HLS
  2333. C
  2334. 1100    CONTINUE
  2335.     CALL GB_EMPTY
  2336.     LVECTOR_GOING = .FALSE.
  2337.     CALL GD4027_MAP(CMD,INT(XA(1)),INT(YA(1)),INT(YA(2)),INT(YA(3)))
  2338.     RETURN
  2339.     END
  2340.     SUBROUTINE GD4027_MAP(CC,ICOLOR,IHUE,ILIGHTNESS,ISATURATION)
  2341. C
  2342. C    THIS SUBROUTINE DOES A 4027 "MAP" COMMAND
  2343. C
  2344.     BYTE STR_MAP(20)
  2345. c    
  2346.     ENCODE (19,11,STR_MAP) CC, ICOLOR, IHUE, ILIGHTNESS, ISATURATION
  2347. 11    FORMAT(A1,'MAP C',I1,',',I3,',',I3,',',I3)
  2348.     STR_MAP(20) = 0
  2349.     CALL GB_IN_STRING(STR_MAP)
  2350.     RETURN
  2351.     END
  2352.     SUBROUTINE GD4027_MIX(CC,ICOLOR,IRED,IGREEN,IBLUE)
  2353. C
  2354. C    THIS SUBROUTINE DOES A 4027 "MIX" COMMAND
  2355. C
  2356.     BYTE STR_MIX(20)
  2357. C
  2358.     ENCODE (19,11,STR_MIX) CC,ICOLOR, IRED, IGREEN, IBLUE
  2359. 11    FORMAT(A1,'MIX C',I1,',',I3,',',I3,',',I3)
  2360.     STR_MIX(20) = 0
  2361.     CALL GB_IN_STRING(STR_MIX)
  2362.     RETURN
  2363.     END
  2364.     SUBROUTINE GD4105(IFXN,XA,YA)
  2365.     DIMENSION XA(8), YA(3)
  2366. C
  2367. C    TEK 4105 DRIVER FOR DIGLIB/VAX
  2368. C        VERSION 2.1A - CURSOR POSITIONING AND HARDWARE POLYGONS (fixed)
  2369. C
  2370. CCCCCCCCCCCCCCCCC
  2371. C
  2372. C    PARAMETERS TO MAKE THIS A 4105 DRIVER
  2373. C
  2374.     PARAMETER (TERM_NUMBER = 4105.0)
  2375.     PARAMETER (SCREEN_WIDTH_CM = 24.564)
  2376.     PARAMETER (SCREEN_HEIGHT_CM = 18.41)
  2377.     PARAMETER (X_DOTS = 480.0)
  2378.     PARAMETER (Y_DOTS = 360.0)
  2379.     PARAMETER (NUMBER_FG_COLORS = 7)
  2380. C
  2381. C    AND NOW, THE GENERIC 410X STUFF
  2382. C
  2383.     INCLUDE 'GD410X.FOR'
  2384.     END
  2385.     SUBROUTINE GD4107(IFXN,XA,YA)
  2386.     DIMENSION XA(8), YA(3)
  2387. C
  2388. C    TEK 4107 DRIVER FOR DIGLIB/VAX
  2389. C        VERSION 2.1 - CURSOR POSITIONING AND HARDWARE POLYGONS
  2390. C
  2391.     BYTE ESC, CSUB, GS, CR, FF, US
  2392.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31)
  2393.     CHARACTER*(*) TERMINAL
  2394.     PARAMETER (TERMINAL='TT')
  2395. C
  2396. C    DEFINITIONS FOR DEVICE CONTROL
  2397. C
  2398.     BYTE STR_END(2), STR_INIT_DEV(26), STR_WINDOW(4)
  2399.     BYTE STR_BEGIN_PLOT(4), STR_COLOR_SET(6)
  2400.     BYTE STR_END_PLOT(2), STR_RLS_DEV(6)
  2401.     BYTE STR_BEGIN_POLY(4), STR_END_POLY(6)
  2402.     DATA STR_END /US,0/
  2403.     DATA STR_INIT_DEV/
  2404.     1   ESC,'%','!','0',        !CODE TEK
  2405.     2   ESC,'K','A','1',        !DAENABLE YES
  2406.     3   ESC,'L','M','0',        !DAMODE REPLACE
  2407.     4   ESC,'M','L','1',        !LINEINDEX 1 (COLOR 1)
  2408.     5   ESC,'N','U',':',        !BYPASS CANCEL CHARACTER (LF)
  2409.     6   ESC,'N','T','1','=',0/    !EOL STRING <CR> <NULL>
  2410.     DATA STR_WINDOW / ESC,'R','W',0/
  2411.     DATA STR_BEGIN_PLOT/
  2412.     1   ESC,FF,0,0/            !ERASE SCREEN
  2413.     DATA STR_COLOR_SET /
  2414.     1   ESC,'M','L','1',0,0/    !LINEINDEX 1 (COLOR N)
  2415.     DATA STR_END_PLOT /0,0/
  2416.     DATA STR_RLS_DEV /
  2417.     1   ESC,'%','!','1',0,0/    !CODE ANSI
  2418.     DATA STR_BEGIN_POLY / ESC,'L','P',0/
  2419.     DATA STR_END_POLY / US,ESC,'L','E',2*0/
  2420. C
  2421. C    DEFINITIONS FOR GIN
  2422. C
  2423.     BYTE GINBUFR(8), PROMPT(4), STR_END_GIN(2), STR_MOVE_GIN_CURSOR(6)
  2424.     DATA PROMPT /ESC, CSUB, 0, 0/
  2425.     DATA IGIN_IN_CHARS /6/
  2426.     DATA STR_END_GIN /10,0/
  2427.     DATA STR_MOVE_GIN_CURSOR / ESC, 'S', 'X', '0', 0,0/
  2428.     DATA IX_GIN_CURSOR, IY_GIN_CURSOR / 240, 180 /
  2429. C
  2430. C    DECLARE BUFFERING FUNCTION
  2431. C
  2432.     LOGICAL GB_TEST_FLUSH
  2433. C
  2434. C    DECLARE VARS NEED FOR DRIVER OPERATION
  2435. C
  2436.     LOGICAL LVECTOR_GOING, LDUMMY
  2437.     DIMENSION DCHAR(8)
  2438. C
  2439. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  2440. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  2441. C
  2442.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  2443.     DATA DCHAR /4107.0, 24.577, 18.423, 26.0, 26.0, 7.0, 389.0, 1.0/
  2444. C
  2445. C*****************
  2446. C
  2447. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  2448. C
  2449.     IF (IFXN .GT. 1026) GOTO 20000
  2450.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  2451. C
  2452. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  2453. C
  2454.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  2455. C
  2456. C    *********************
  2457. C    INITIALIZE THE DEVICE
  2458. C    *********************
  2459. C
  2460. 100    CONTINUE
  2461. C
  2462. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  2463. C
  2464.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  2465.     YA(1) = IERR
  2466.     IF (IERR .NE. 0) RETURN
  2467. C
  2468. C    INITIALIZE THE 4107
  2469. C
  2470.     CALL GB_IN_STRING(STR_INIT_DEV)
  2471.     CALL GB_IN_STRING(STR_WINDOW)
  2472.     CALL GD_4010_CONVERT(0,0)
  2473.     IX = INT(DCHAR(2)*XGUPCM+0.5)
  2474.     IY = INT(DCHAR(3)*YGUPCM+0.5)
  2475.     CALL GD_4010_CONVERT(IX,IY)
  2476.     CALL GB_EMPTY
  2477.     LVECTOR_GOING = .FALSE.
  2478.     RETURN
  2479. C
  2480. C    **************************
  2481. C    GET FRESH PLOTTING SURFACE
  2482. C    **************************
  2483. C
  2484. 200    CONTINUE
  2485.     CALL GB_NEW_BUFFER
  2486.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  2487.     CALL GB_EMPTY
  2488.     LVECTOR_GOING = .FALSE.
  2489.     RETURN
  2490. C
  2491. C    ****
  2492. C    MOVE
  2493. C    ****
  2494. C
  2495. 300    CONTINUE
  2496. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  2497.     IXPOSN = XGUPCM*XA(1)+0.5
  2498.     IYPOSN = YGUPCM*YA(1)+0.5
  2499.     LVECTOR_GOING = .FALSE.
  2500.     RETURN
  2501. C
  2502. C    ****
  2503. C    DRAW
  2504. C    ****
  2505. C
  2506. 400    CONTINUE
  2507.     IX = XGUPCM*XA(1)+0.5
  2508.     IY = YGUPCM*YA(1)+0.5
  2509.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  2510.     IF (LVECTOR_GOING) GO TO 410
  2511.     LDUMMY = GB_TEST_FLUSH(9)
  2512.     LVECTOR_GOING = .TRUE.
  2513.     CALL GB_INSERT(GS)
  2514.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  2515. 410    CALL GD_4010_CONVERT(IX,IY)
  2516.     IXPOSN = IX
  2517.     IYPOSN = IY
  2518.     RETURN
  2519. C
  2520. C    *****************************
  2521. C    FLUSH GRAPHICS COMMAND BUFFER
  2522. C    *****************************
  2523. C
  2524. 500    CONTINUE
  2525.     CALL GB_EMPTY
  2526.     CALL GB_IN_STRING(STR_END_PLOT)
  2527.     CALL GB_EMPTY
  2528.     LVECTOR_GOING = .FALSE.
  2529.     RETURN
  2530. C
  2531. C    ******************
  2532. C    RELEASE THE DEVICE
  2533. C    ******************
  2534. C
  2535. 600    CONTINUE
  2536. C
  2537. C    DE-ASSIGN THE CHANNAL
  2538. C
  2539.     CALL GB_EMPTY
  2540.     CALL GB_IN_STRING(STR_WINDOW)
  2541.     CALL GD_4010_CONVERT(0,0)
  2542.     CALL GD_4010_CONVERT(1023,767)
  2543.     CALL GB_FINISH(STR_RLS_DEV)
  2544.     RETURN
  2545. C
  2546. C    *****************************
  2547. C    RETURN DEVICE CHARACTERISTICS
  2548. C    *****************************
  2549. C
  2550. 700    CONTINUE
  2551.     DO 720 I=1,8
  2552.     XA(I) = DCHAR(I)
  2553. 720    CONTINUE
  2554.     RETURN
  2555. C
  2556. C    ****************************
  2557. C    SELECT CURRENT DRAWING COLOR
  2558. C    ****************************
  2559. C
  2560. 800    CONTINUE
  2561.     LDUMMY = GB_TEST_FLUSH(6)
  2562.     ICOLOR = XA(1)
  2563.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 7) RETURN
  2564.     STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER
  2565.     CALL GB_IN_STRING(STR_COLOR_SET)
  2566.     LVECTOR_GOING = .FALSE.
  2567.     RETURN
  2568. C
  2569. C    **********************
  2570. C    PERFORM GRAPHICS INPUT
  2571. C    **********************
  2572. C
  2573. 900    CONTINUE
  2574. C
  2575. C    POSITION CURSOR TO ITS LAST GIN POSITION (ELSE MIDDLE OF SCREEN)
  2576. C
  2577.     CALL GB_TEST_FLUSH(10)
  2578.     CALL GB_IN_STRING(STR_MOVE_GIN_CURSOR)
  2579.     CALL GD_4010_CONVERT(IX_GIN_CURSOR,IY_GIN_CURSOR)
  2580.     CALL GB_EMPTY
  2581. C
  2582.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  2583. C
  2584.     ICHAR = GINBUFR(1)
  2585.     IX1 = GINBUFR(2)
  2586.     IX2 = GINBUFR(3)
  2587.     IY1 = GINBUFR(4)
  2588.     IY2 = GINBUFR(5)
  2589. C
  2590.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  2591.     IX_GIN_CURSOR = 32*IAND(IX1,31)+IAND(IX2,31)
  2592.     XA(2) = IX_GIN_CURSOR/XGUPCM
  2593.     IY_GIN_CURSOR = 32*IAND(IY1,31)+IAND(IY2,31)
  2594.     XA(3) = IY_GIN_CURSOR/YGUPCM
  2595. C
  2596.     CALL GB_IN_STRING(STR_END_GIN)
  2597.     CALL GB_EMPTY
  2598.     RETURN
  2599. C
  2600. C    *******************
  2601. C    DRAW FILLED POLYGON
  2602. C    *******************
  2603. C
  2604. 20000    CONTINUE
  2605.     NPTS = IFXN - 1024
  2606.     IX = XGUPCM*XA(1)+0.5
  2607.     IY = YGUPCM*YA(1)+0.5
  2608.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(20))
  2609.     IF (LVECTOR_GOING) THEN
  2610.         CALL GB_INSERT(US)
  2611.         LVECTOR_GOING = .FALSE.
  2612.     ENDIF
  2613.     CALL GB_IN_STRING(STR_BEGIN_POLY)
  2614.     CALL GD_4010_CONVERT(IX,IY)
  2615. C
  2616. C    DO VERTICES 2 THRU N.   NOTE: WE START WITH A <GS> SINCE
  2617. C     LVECTOR_GOING IS "FALSE"
  2618. C
  2619.         DO 20010 I = 2, NPTS
  2620. C        MAKE SURE 10 CHARS (4 FOR X,Y AND 6 FOR END POLYGON)
  2621.         LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(10))
  2622.         IF (.NOT. LVECTOR_GOING) CALL GB_INSERT(GS)
  2623.         CALL GD_4010_CONVERT(INT(XGUPCM*XA(I)+0.5),
  2624.     1        INT(YGUPCM*YA(I)+0.5))
  2625. 20010        CONTINUE
  2626.     CALL GB_IN_STRING(STR_END_POLY)
  2627.     LVECTOR_GOING = .FALSE.
  2628.     RETURN
  2629.     END
  2630.     PARAMETER (X_RES = (X_DOTS-1.0)/SCREEN_WIDTH_CM)
  2631.     PARAMETER (Y_RES = (Y_DOTS-1.0)/SCREEN_HEIGHT_CM)
  2632.     PARAMETER (RESOLUTION = (X_RES+Y_RES)/2.0)
  2633.     PARAMETER (XLENGTH = (X_DOTS-1.0)/RESOLUTION)
  2634.     PARAMETER (YLENGTH = (Y_DOTS-1.0)/RESOLUTION)
  2635.     PARAMETER (COLORS_FG = NUMBER_FG_COLORS)
  2636.     PARAMETER (IX_CENTER = RESOLUTION*XLENGTH/2.0)
  2637.     PARAMETER (IY_CENTER = RESOLUTION*YLENGTH/2.0)
  2638.     BYTE ESC,CSUB,GS,CR,FF,US
  2639.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31)
  2640.     CHARACTER*(*) TERMINAL
  2641.     PARAMETER (TERMINAL='TT')
  2642. C
  2643. C    DEFINITIONS FOR DEVICE CONTROL
  2644. C
  2645.     BYTE STR_END(2), STR_INIT_DEV(26), STR_WINDOW(4)
  2646.     BYTE STR_BEGIN_PLOT(4), STR_COLOR_SET(6)
  2647.     BYTE STR_END_PLOT(2), STR_RLS_DEV(6)
  2648.     BYTE STR_BEGIN_POLY(4), STR_END_POLY(6)
  2649.     BYTE STR_FILL_PATRN(6)
  2650.     DATA STR_END /US,0/
  2651.     DATA STR_INIT_DEV/
  2652.     1   ESC,'%','!','0',        !CODE TEK
  2653.     2   ESC,'K','A','1',        !DAENABLE YES
  2654.     3   ESC,'L','M','0',        !DAMODE REPLACE
  2655.     4   ESC,'M','L','1',        !LINEINDEX 1 (COLOR 1)
  2656.     5   ESC,'N','U',':',        !BYPASS CANCEL CHARACTER (LF)
  2657.     6   ESC,'N','T','1','=',0/    !EOL STRING <CR> <NULL>
  2658.     DATA STR_WINDOW / ESC,'R','W',0/
  2659.     DATA STR_BEGIN_PLOT/
  2660.     1   ESC,FF,0,0/            !ERASE SCREEN
  2661.     DATA STR_COLOR_SET /
  2662.     1   ESC,'M','L','1',0,0/    !LINEINDEX 1 (COLOR N)
  2663.     DATA STR_END_PLOT /0,0/
  2664.     DATA STR_RLS_DEV /
  2665.     1   ESC,'%','!','1',0,0/    !CODE ANSI
  2666.     DATA STR_BEGIN_POLY / ESC,'L','P',0/
  2667.     DATA STR_END_POLY / US,ESC,'L','E',2*0/
  2668.     DATA STR_FILL_PATRN /ESC,'M','P',' ',2*0/
  2669. C
  2670. C    DEFINITIONS FOR GIN
  2671. C
  2672.     BYTE GINBUFR(8), PROMPT(4), STR_END_GIN(2), STR_MOVE_GIN_CURSOR(6)
  2673.     DATA PROMPT /ESC, CSUB, 0, 0/
  2674.     DATA IGIN_IN_CHARS /6/
  2675.     DATA STR_END_GIN /10,0/
  2676.     DATA STR_MOVE_GIN_CURSOR / ESC, 'S', 'X', '0', 0,0/
  2677.     DATA IX_GIN_CURSOR, IY_GIN_CURSOR / IX_CENTER, IY_CENTER /
  2678. C
  2679. C    DECLARE BUFFERING FUNCTION
  2680. C
  2681.     LOGICAL GB_TEST_FLUSH
  2682. C
  2683. C    DECLARE VARS NEED FOR DRIVER OPERATION
  2684. C
  2685.     LOGICAL LVECTOR_GOING, LDUMMY
  2686.     DIMENSION DCHAR(8)
  2687. C
  2688. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  2689. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  2690. C
  2691.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  2692.     DATA DCHAR / TERM_NUMBER, XLENGTH, YLENGTH, RESOLUTION,
  2693.     1   RESOLUTION, COLORS_FG, 389.0, 1.0/
  2694. C
  2695. C*****************
  2696. C
  2697. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  2698. C
  2699.     IF (IFXN .GT. 1026) GOTO 20000
  2700.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  2701. C
  2702. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  2703. C
  2704.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  2705. C
  2706. C    *********************
  2707. C    INITIALIZE THE DEVICE
  2708. C    *********************
  2709. C
  2710. 100    CONTINUE
  2711. C
  2712. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  2713. C
  2714.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  2715.     YA(1) = IERR
  2716.     IF (IERR .NE. 0) RETURN
  2717. C
  2718. C    INITIALIZE THE 4105
  2719. C
  2720.     CALL GB_IN_STRING(STR_INIT_DEV)
  2721.     CALL GB_IN_STRING(STR_WINDOW)
  2722.     CALL GD_4010_CONVERT(0,0)
  2723.     IX = INT(DCHAR(2)*XGUPCM+0.5)
  2724.     IY = INT(DCHAR(3)*YGUPCM+0.5)
  2725.     CALL GD_4010_CONVERT(IX,IY)
  2726.     CALL GB_EMPTY
  2727.     LVECTOR_GOING = .FALSE.
  2728.     RETURN
  2729. C
  2730. C    **************************
  2731. C    GET FRESH PLOTTING SURFACE
  2732. C    **************************
  2733. C
  2734. 200    CONTINUE
  2735.     CALL GB_EMPTY
  2736.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  2737.     CALL GB_EMPTY
  2738.     LVECTOR_GOING = .FALSE.
  2739.     RETURN
  2740. C
  2741. C    ****
  2742. C    MOVE
  2743. C    ****
  2744. C
  2745. 300    CONTINUE
  2746. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  2747.     IXPOSN = XGUPCM*XA(1)+0.5
  2748.     IYPOSN = YGUPCM*YA(1)+0.5
  2749.     LVECTOR_GOING = .FALSE.
  2750.     RETURN
  2751. C
  2752. C    ****
  2753. C    DRAW
  2754. C    ****
  2755. C
  2756. 400    CONTINUE
  2757.     IX = XGUPCM*XA(1)+0.5
  2758.     IY = YGUPCM*YA(1)+0.5
  2759.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  2760.     IF (LVECTOR_GOING) GO TO 410
  2761.     LDUMMY = GB_TEST_FLUSH(9)
  2762.     LVECTOR_GOING = .TRUE.
  2763.     CALL GB_INSERT(GS)
  2764.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  2765. 410    CALL GD_4010_CONVERT(IX,IY)
  2766.     IXPOSN = IX
  2767.     IYPOSN = IY
  2768.     RETURN
  2769. C
  2770. C    *****************************
  2771. C    FLUSH GRAPHICS COMMAND BUFFER
  2772. C    *****************************
  2773. C
  2774. 500    CONTINUE
  2775.     CALL GB_EMPTY
  2776.     CALL GB_IN_STRING(STR_END_PLOT)
  2777.     CALL GB_EMPTY
  2778.     LVECTOR_GOING = .FALSE.
  2779.     RETURN
  2780. C
  2781. C    ******************
  2782. C    RELEASE THE DEVICE
  2783. C    ******************
  2784. C
  2785. 600    CONTINUE
  2786. C
  2787. C    DE-ASSIGN THE CHANNAL
  2788. C
  2789.     CALL GB_EMPTY
  2790.     CALL GB_IN_STRING(STR_WINDOW)
  2791.     CALL GD_4010_CONVERT(0,0)
  2792.     CALL GD_4010_CONVERT(1023,767)
  2793.     CALL GB_FINISH(STR_RLS_DEV)
  2794.     RETURN
  2795. C
  2796. C    *****************************
  2797. C    RETURN DEVICE CHARACTERISTICS
  2798. C    *****************************
  2799. C
  2800. 700    CONTINUE
  2801.     DO 720 I=1,8
  2802.     XA(I) = DCHAR(I)
  2803. 720    CONTINUE
  2804.     RETURN
  2805. C
  2806. C    ****************************
  2807. C    SELECT CURRENT DRAWING COLOR
  2808. C    ****************************
  2809. C
  2810. 800    CONTINUE
  2811.     LDUMMY = GB_TEST_FLUSH(6)
  2812.     ICOLOR = XA(1)
  2813.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. NUMBER_FG_COLORS) RETURN
  2814.     STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER
  2815.     CALL GB_IN_STRING(STR_COLOR_SET)
  2816.     LVECTOR_GOING = .FALSE.
  2817.     RETURN
  2818. C
  2819. C    **********************
  2820. C    PERFORM GRAPHICS INPUT
  2821. C    **********************
  2822. C
  2823. 900    CONTINUE
  2824. C
  2825. C    POSITION CURSOR TO ITS LAST GIN POSITION (ELSE MIDDLE OF SCREEN)
  2826. C
  2827.     CALL GB_TEST_FLUSH(10)
  2828.     CALL GB_IN_STRING(STR_MOVE_GIN_CURSOR)
  2829.     CALL GD_4010_CONVERT(IX_GIN_CURSOR,IY_GIN_CURSOR)
  2830.     CALL GB_EMPTY
  2831. C
  2832.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  2833. C
  2834.     ICHAR = GINBUFR(1)
  2835.     IX1 = GINBUFR(2)
  2836.     IX2 = GINBUFR(3)
  2837.     IY1 = GINBUFR(4)
  2838.     IY2 = GINBUFR(5)
  2839. C
  2840.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  2841.     IX_GIN_CURSOR = 32*IAND(IX1,31)+IAND(IX2,31)
  2842.     XA(2) = IX_GIN_CURSOR/XGUPCM
  2843.     IY_GIN_CURSOR = 32*IAND(IY1,31)+IAND(IY2,31)
  2844.     XA(3) = IY_GIN_CURSOR/YGUPCM
  2845. C
  2846.     CALL GB_IN_STRING(STR_END_GIN)
  2847.     CALL GB_EMPTY
  2848.     RETURN
  2849. C
  2850. C    *******************
  2851. C    DRAW FILLED POLYGON
  2852. C    *******************
  2853. C
  2854. 20000    CONTINUE
  2855.     NPTS = IFXN - 1024
  2856.     IX = XGUPCM*XA(1)+0.5
  2857.     IY = YGUPCM*YA(1)+0.5
  2858.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(26))
  2859.     IF (LVECTOR_GOING) THEN
  2860.         CALL GB_INSERT(US)
  2861.         LVECTOR_GOING = .FALSE.
  2862.     ENDIF
  2863.     STR_FILL_PATRN(4) = 32 + ICOLOR
  2864.     IF (ICOLOR .EQ. 0) STR_FILL_PATRN(4) = 80
  2865.     CALL GB_IN_STRING(STR_FILL_PATRN)
  2866.     CALL GB_IN_STRING(STR_BEGIN_POLY)
  2867.     CALL GD_4010_CONVERT(IX,IY)
  2868. C
  2869. C    DO VERTICES 2 THRU N.   NOTE: WE START WITH A <GS> SINCE
  2870. C     LVECTOR_GOING IS "FALSE"
  2871. C
  2872.         DO 20010 I = 2, NPTS
  2873. C        MAKE SURE 10 CHARS (4 FOR X,Y AND 6 FOR END POLYGON)
  2874.         LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(10))
  2875.         IF (.NOT. LVECTOR_GOING) CALL GB_INSERT(GS)
  2876.         CALL GD_4010_CONVERT(INT(XGUPCM*XA(I)+0.5),
  2877.     1        INT(YGUPCM*YA(I)+0.5))
  2878. 20010        CONTINUE
  2879.     CALL GB_IN_STRING(STR_END_POLY)
  2880.     LVECTOR_GOING = .FALSE.
  2881.     RETURN
  2882.     SUBROUTINE GD4115B(IFXN,XA,YA)
  2883.     DIMENSION XA(8), YA(3)
  2884. C
  2885. C    TEK 4115B DRIVER FOR DIGLIB/VAX
  2886. C        VERSION 1.0 - CURSOR POSITIONING AND HARDWARE POLYGONS
  2887. C
  2888.     BYTE ESC, CSUB, GS, CR, FF, US, LF
  2889.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31, LF=10)
  2890.     CHARACTER*(*) TERMINAL
  2891.     PARAMETER (TERMINAL='TEK4115B_TERM')
  2892. C
  2893. C    DEFINITIONS FOR DEVICE CONTROL
  2894. C
  2895.     BYTE STR_END(2), STR_INIT_DEV(48), STR_WINDOW(4)
  2896.     BYTE STR_BEGIN_PLOT(6), STR_COLOR_SET(4)
  2897.     BYTE STR_END_PLOT(2), STR_RLS_DEV(6)
  2898.     BYTE STR_BEGIN_POLY(4), STR_END_POLY(6)
  2899.     BYTE STR_FILL_PATRN(4), STR_SET_GIN_WINDOW(4)
  2900.     BYTE STR_SET_GIN_AREA(6)
  2901.     DATA STR_END /US,0/
  2902.     DATA STR_INIT_DEV/
  2903.     1   ESC,'%','!','0',        !CODE TEK
  2904.     2   ESC,'K','A','1',        !DAENABLE YES
  2905.     3   ESC,'L','M','0',        !DAMODE REPLACE
  2906.     4   ESC,'M','L','1',        !LINEINDEX 1 (COLOR 1)
  2907.     5   ESC,'N','U',':',        !BYPASS CANCEL CHARACTER (LF)
  2908.     6   ESC,'N','T','1','=',    !EOL STRING <CR> <NULL>
  2909.     7   ESC,'N','F','3',        !FLAGGING IN/OUT (XON/XOFF IN USE)
  2910.     8   ESC,'I','C','0','0',    !USE CROSS HAIR CURSOR
  2911.     9   ESC,'I','G','0','0','0',    !NO GIN GRIDDING
  2912.     1   ESC,'T','M','4','1','1',2*0/!SET_COLOR_MODE (MACHINE/OPAQUE/COLOR)
  2913.     DATA STR_WINDOW / ESC,'R','W',0/
  2914.     DATA STR_SET_GIN_WINDOW / ESC,'I','W',0/
  2915.     DATA STR_SET_GIN_AREA / ESC,'I','V','0',33,0/
  2916.     DATA STR_BEGIN_PLOT/
  2917.     1   ESC,'R','D','1','4',0/    !1 DISPLAY SURFACE OF 4 BIT PLANES
  2918.     DATA STR_COLOR_SET /
  2919.     1   ESC,'M','L',0/        !LINEINDEX 1 (COLOR N)
  2920.     DATA STR_END_PLOT /0,0/
  2921.     DATA STR_RLS_DEV /
  2922.     1   ESC,'%','!','1',0,0/    !CODE ANSI
  2923.     DATA STR_BEGIN_POLY / ESC,'L','P',0/
  2924.     DATA STR_END_POLY / US,ESC,'L','E',2*0/
  2925.     DATA STR_FILL_PATRN /ESC,'M','P',0/
  2926. C
  2927. C    DEFINITIONS FOR GIN
  2928. C
  2929.     BYTE GINBUFR(10), PROMPT(6), STR_MOVE_GIN_CURSOR(6)
  2930.     DATA PROMPT /ESC, 'I','E','0','1', 0/
  2931.     DATA IGIN_IN_CHARS /8/
  2932.     DATA STR_MOVE_GIN_CURSOR / ESC, 'S', 'X', '0', 0,0/
  2933.     DATA IX_GIN_CURSOR, IY_GIN_CURSOR / 640, 512 /
  2934. C
  2935. C    DECLARE BUFFERING FUNCTION
  2936. C
  2937.     LOGICAL GB_TEST_FLUSH
  2938. C
  2939. C    DECLARE VARS NEED FOR DRIVER OPERATION
  2940. C
  2941.     LOGICAL LVECTOR_GOING, LDUMMY
  2942.     DIMENSION DCHAR(8)
  2943. C
  2944. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  2945. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  2946. C
  2947.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  2948.     DATA DCHAR /4115.0, 34.778, 27.817, 36.776, 36.776, 15.0, 389.0, 1.0/
  2949. C
  2950. C*****************
  2951. C
  2952. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  2953. C
  2954.     IF (IFXN .GT. 1026) GOTO 20000
  2955.     IF (IFXN .LE. 0 .OR. IFXN .GT. 10) RETURN
  2956. C
  2957. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  2958. C
  2959.     GO TO (100,200,300,400,500,600,700,800,900,1000) IFXN
  2960. C
  2961. C    *********************
  2962. C    INITIALIZE THE DEVICE
  2963. C    *********************
  2964. C
  2965. 100    CONTINUE
  2966. C
  2967. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  2968. C
  2969.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  2970.     YA(1) = IERR
  2971.     IF (IERR .NE. 0) RETURN
  2972. C
  2973. C    INITIALIZE THE 4115
  2974. C
  2975.     CALL GB_IN_STRING(STR_INIT_DEV)
  2976.     CALL GB_IN_STRING(STR_WINDOW)
  2977.     CALL GD_4014_CONVERT(0,0)
  2978.     IX = INT(DCHAR(2)*XGUPCM+0.5)
  2979.     IY = INT(DCHAR(3)*YGUPCM+0.5)
  2980.     CALL GD_4014_CONVERT(IX,IY)
  2981.     CALL GB_IN_STRING(STR_SET_GIN_WINDOW)
  2982.     CALL GD_4014_CONVERT(0,0)
  2983.     CALL GD_4014_CONVERT(4095,4095)
  2984.     CALL GB_IN_STRING(STR_SET_GIN_AREA)
  2985.     CALL GD_4014_CONVERT(0,0)
  2986.     CALL GD_4014_CONVERT(4095,4095)
  2987.     CALL GB_EMPTY
  2988.     LVECTOR_GOING = .FALSE.
  2989.     ICOLOR = 1
  2990.     RETURN
  2991. C
  2992. C    **************************
  2993. C    GET FRESH PLOTTING SURFACE
  2994. C    **************************
  2995. C
  2996. 200    CONTINUE
  2997.     CALL GB_EMPTY
  2998.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  2999.     CALL GD4115_CMAP(1,100.0,100.0,100.0)
  3000.     CALL GD4115_CMAP(2,100.0,0.0,0.0)
  3001.     CALL GD4115_CMAP(3,0.0,100.0,0.0)
  3002.     CALL GD4115_CMAP(4,0.0,0.0,100.0)
  3003.     CALL GD4115_CMAP(5,100.0,100.0,0.0)
  3004.     CALL GD4115_CMAP(6,100.0,0.0,100.0)
  3005.     CALL GD4115_CMAP(7,0.0,100.0,100.0)
  3006.     CALL GB_EMPTY
  3007.     LVECTOR_GOING = .FALSE.
  3008.     RETURN
  3009. C
  3010. C    ****
  3011. C    MOVE
  3012. C    ****
  3013. C
  3014. 300    CONTINUE
  3015. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  3016.     IXPOSN = XGUPCM*XA(1)+0.5
  3017.     IYPOSN = YGUPCM*YA(1)+0.5
  3018.     LVECTOR_GOING = .FALSE.
  3019.     RETURN
  3020. C
  3021. C    ****
  3022. C    DRAW
  3023. C    ****
  3024. C
  3025. 400    CONTINUE
  3026.     IX = XGUPCM*XA(1)+0.5
  3027.     IY = YGUPCM*YA(1)+0.5
  3028.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(5))
  3029.     IF (LVECTOR_GOING) GO TO 410
  3030.     LDUMMY = GB_TEST_FLUSH(11)
  3031.     LVECTOR_GOING = .TRUE.
  3032.     CALL GB_INSERT(GS)
  3033.     CALL GD_4014_CONVERT(IXPOSN,IYPOSN)
  3034. 410    IF (IX .NE. IXPOSN .OR. IY .NE. IYPOSN) THEN
  3035.         CALL GD_4014_CONVERT(IX,IY)
  3036.         IXPOSN = IX
  3037.         IYPOSN = IY
  3038.     ENDIF
  3039.     RETURN
  3040. C
  3041. C    *****************************
  3042. C    FLUSH GRAPHICS COMMAND BUFFER
  3043. C    *****************************
  3044. C
  3045. 500    CONTINUE
  3046.     CALL GB_EMPTY
  3047.     CALL GB_IN_STRING(STR_END_PLOT)
  3048.     CALL GB_EMPTY
  3049.     LVECTOR_GOING = .FALSE.
  3050.     RETURN
  3051. C
  3052. C    ******************
  3053. C    RELEASE THE DEVICE
  3054. C    ******************
  3055. C
  3056. 600    CONTINUE
  3057. C
  3058. C    DE-ASSIGN THE CHANNAL
  3059. C
  3060.     CALL GB_EMPTY
  3061.     CALL GB_IN_STRING(STR_WINDOW)
  3062.     CALL GD_4014_CONVERT(0,0)
  3063.     CALL GD_4014_CONVERT(4095,4095)
  3064.     CALL GB_FINISH(STR_RLS_DEV)
  3065.     RETURN
  3066. C
  3067. C    *****************************
  3068. C    RETURN DEVICE CHARACTERISTICS
  3069. C    *****************************
  3070. C
  3071. 700    CONTINUE
  3072.     DO 720 I=1,8
  3073.     XA(I) = DCHAR(I)
  3074. 720    CONTINUE
  3075.     RETURN
  3076. C
  3077. C    ****************************
  3078. C    SELECT CURRENT DRAWING COLOR
  3079. C    ****************************
  3080. C
  3081. 800    CONTINUE
  3082.     LDUMMY = GB_TEST_FLUSH(10)
  3083.     ICOLOR = XA(1)
  3084.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. INT(DCHAR(6))) RETURN
  3085.     CALL GB_IN_STRING(STR_COLOR_SET)
  3086.     CALL GD_4110_INT(ICOLOR)
  3087.     LVECTOR_GOING = .FALSE.
  3088.     RETURN
  3089. C
  3090. C    **********************
  3091. C    PERFORM GRAPHICS INPUT
  3092. C    **********************
  3093. C
  3094. 900    CONTINUE
  3095. C
  3096. C    POSITION CURSOR TO ITS LAST GIN POSITION (ELSE MIDDLE OF SCREEN)
  3097. C
  3098.     CALL GB_TEST_FLUSH(12)
  3099.     CALL GB_IN_STRING(STR_MOVE_GIN_CURSOR)
  3100.     CALL GD_4014_CONVERT(IX_GIN_CURSOR,IY_GIN_CURSOR)
  3101.     CALL GB_EMPTY
  3102. C
  3103.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  3104. C
  3105.     CALL GB_INSERT(LF)        !SEND BYPASS CANCEL CHARACTER
  3106.     CALL GB_EMPTY
  3107. C
  3108.     IF (GINBUFR(7) .EQ. CR .AND. GINBUFR(8) .EQ. CR) GO TO 960
  3109.         CALL GB_IN_STRING('Error reading cursor, try again.')
  3110.         CALL GB_INSERT(CR)
  3111.         CALL GB_EMPTY
  3112. D        TYPE 9999, (I,GINBUFR(I), I=1,IGIN_IN_CHARS)
  3113. D9999        FORMAT(' Character ',I2,' is ',I4,' decimal.')
  3114.         GO TO 900
  3115. C
  3116. 960    CONTINUE
  3117.     ICHAR = GINBUFR(1)
  3118.     IY1 = GINBUFR(2)
  3119.     IEX = GINBUFR(3)
  3120.     IY2 = GINBUFR(4)
  3121.     IX1 = GINBUFR(5)
  3122.     IX2 = GINBUFR(6)
  3123. C
  3124.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  3125.     IX_GIN_CURSOR = 128*IAND(IX1,31)+4*IAND(IX2,31)+IAND(IEX,3)
  3126.     XA(2) = IX_GIN_CURSOR/XGUPCM
  3127.     IY_GIN_CURSOR = 128*IAND(IY1,31)+4*IAND(IY2,31)+IAND(IEX/4,3)
  3128.     XA(3) = IY_GIN_CURSOR/YGUPCM
  3129.     RETURN
  3130. C
  3131. C    *********************
  3132. C    DEFINE COLOR WITH RGB
  3133. C    *********************
  3134. C
  3135. 1000    CONTINUE
  3136.     CALL GB_TEST_FLUSH(14)
  3137.     CALL GD4115_CMAP(INT(XA(1)),YA(1),YA(2),YA(3))
  3138.     LVECTOR_GOING = .FALSE.
  3139.     RETURN
  3140. C
  3141. C    *******************
  3142. C    DRAW FILLED POLYGON
  3143. C    *******************
  3144. C
  3145. 20000    CONTINUE
  3146.     NPTS = IFXN - 1024
  3147.     IX = XGUPCM*XA(1)+0.5
  3148.     IY = YGUPCM*YA(1)+0.5
  3149.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(40))
  3150.     IF (LVECTOR_GOING) THEN
  3151.         CALL GB_INSERT(US)
  3152.         LVECTOR_GOING = .FALSE.
  3153.     ENDIF
  3154.     CALL GB_IN_STRING(STR_FILL_PATRN)
  3155.     CALL GD_4110_INT(-ICOLOR)
  3156.     CALL GB_IN_STRING(STR_BEGIN_POLY)
  3157.     CALL GD_4014_CONVERT(IX,IY)
  3158. C
  3159. C    DO VERTICES 2 THRU N.   NOTE: WE START WITH A <GS> SINCE
  3160. C     LVECTOR_GOING IS "FALSE"
  3161. C
  3162.         DO 20010 I = 2, NPTS
  3163. C        MAKE SURE 11 CHARS (5 FOR X,Y AND 6 FOR END POLYGON)
  3164.         LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(11))
  3165.         IF (.NOT. LVECTOR_GOING) CALL GB_INSERT(GS)
  3166.         CALL GD_4014_CONVERT(INT(XGUPCM*XA(I)+0.5),
  3167.     1        INT(YGUPCM*YA(I)+0.5))
  3168. 20010        CONTINUE
  3169.     CALL GB_IN_STRING(STR_END_POLY)
  3170.     LVECTOR_GOING = .FALSE.
  3171.     RETURN
  3172.     END
  3173.  
  3174.     SUBROUTINE GD_4110_INT(INT)
  3175. C
  3176. C    CONVERT AN INTEGER INTO THE 4110 32-BIT INTEGER FORMAT AND PLACES
  3177. C    IT IN THE OUTPUT BUFFER
  3178. C
  3179.     BYTE STRING(6)
  3180.     DATA STRING(6) /0/
  3181. C
  3182.     INTABS = IABS(INT)
  3183.     STRING(5) = 48 + IAND(INTABS,15)
  3184.     IF (INT .LT. 0) STRING(5) = STRING(5) - 16
  3185.     I = 5
  3186.     INTABS = INTABS/16
  3187. 100        CONTINUE
  3188.         IF (INTABS .EQ. 0) GO TO 120
  3189.         I = I-1
  3190.         STRING(I) = 64 + IAND(INTABS,63)
  3191.         INTABS = INTABS/64
  3192.         GO TO 100
  3193. 120    CONTINUE
  3194.     CALL GB_IN_STRING(STRING(I))
  3195.     RETURN
  3196.     END
  3197.  
  3198.  
  3199.     SUBROUTINE GD4115_CMAP(ICOLOR,RED,GRN,BLU)
  3200. C
  3201. C    THIS SUBROUTINE SETS THE SPECIFIED COLOR INTO THE LOOK-UP TABLE.
  3202. C    IT ASSUMES THE CALLER HAS MADE SURE THERE ARE ATLEAST 12 BYTES
  3203. C    AVAILABLE IN THE BUFFER.
  3204. C
  3205.     BYTE ESC
  3206.     PARAMETER (ESC=27)
  3207.     PARAMETER (COLORS = 2.55)
  3208.     PARAMETER (MAXCOL = 255)
  3209. C
  3210.     BYTE SET_SURFACE_COLOR_MAP(6)
  3211.     DATA SET_SURFACE_COLOR_MAP /ESC, 'T', 'G', '1', '4', 0/
  3212. C
  3213.     CALL GB_TEST_FLUSH(20)
  3214.     CALL GB_IN_STRING(SET_SURFACE_COLOR_MAP)
  3215.     CALL GD_4110_INT(ICOLOR)
  3216.     CALL GD_4110_INT(MIN(MAXCOL,INT(COLORS*RED+0.5)))
  3217.     CALL GD_4110_INT(MIN(MAXCOL,INT(COLORS*GRN+0.5)))
  3218.     CALL GD_4110_INT(MIN(MAXCOL,INT(COLORS*BLU+0.5)))
  3219.     RETURN
  3220.     END
  3221.     SUBROUTINE GD4692 (IFXN,XA,YA)
  3222. c  TEKtronix 4692 DRIVER FOR DIGLIB/VAX
  3223. c    Author believed to be Giles Peterson.
  3224. c    Slightly modified by Hal Brand:
  3225. c        * Logical name TEK4692_TTY for terminal port
  3226.  
  3227.     DIMENSION XA(8), YA(3)
  3228.  
  3229.     PARAMETER (TERM_NUMBER = 4692.0)
  3230.     PARAMETER (SCREEN_WIDTH_CM = 24.564)
  3231.     PARAMETER (SCREEN_HEIGHT_CM = 18.41)
  3232.     PARAMETER (X_DOTS = 4096.0)
  3233.     PARAMETER (Y_DOTS = 3133.0)
  3234.     PARAMETER (NUMBER_FG_COLORS = 255)
  3235.  
  3236.       parameter (xdm1 = x_dots-1.)
  3237.       parameter (ydm1 = y_dots-1.)
  3238.     PARAMETER (X_RES = xdm1/SCREEN_WIDTH_CM)
  3239.     PARAMETER (Y_RES = ydm1/SCREEN_HEIGHT_CM)
  3240.     PARAMETER (RESOLUTION = (X_RES+Y_RES)/2.0)
  3241.       parameter (tallx = resolution*x_dots/y_dots)
  3242.       parameter (tally = resolution*y_dots/x_dots)
  3243.     PARAMETER (XLENGTH = xdm1/RESOLUTION)
  3244.     PARAMETER (YLENGTH = ydm1/RESOLUTION)
  3245.     PARAMETER (COLORS_FG = NUMBER_FG_COLORS)
  3246.     PARAMETER (IX_CENTER = RESOLUTION*XLENGTH/2.0)
  3247.     PARAMETER (IY_CENTER = RESOLUTION*YLENGTH/2.0)
  3248.     BYTE eb,ESC,CSUB,GS,CR,FF,US
  3249.     PARAMETER (eb=23,ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31)
  3250.     CHARACTER*(*) TERMINAL
  3251.     PARAMETER (TERMINAL='TEK4692_TTY')
  3252.  
  3253. C    DEFINITIONS FOR DEVICE CONTROL
  3254.       byte fillpattern(4),lineindex(4),textindex(4)
  3255.     BYTE STR_END(2), STR_INIT_DEV(25), STR_WINDOW(4)
  3256.     BYTE STR_BEGIN_PLOT(3)
  3257.     BYTE STR_END_PLOT(3), unreserve(5)
  3258.     BYTE beginpanel(4),endpanel(4)
  3259.       logical tall
  3260.       data beginpanel /ESC,'L','P',0/,
  3261.      *  fillpattern/esc,'M','P',0/,
  3262.      *  lineindex/esc,'M','L',0/,
  3263.      *  textindex/esc,'M','T',0/
  3264.     DATA STR_END /US,0/
  3265.     DATA STR_INIT_DEV/esc,'K','C',
  3266.      *  esc,'Q','O','0',
  3267.      *  ESC,'K','A','1',        !ENABLE dialog area
  3268.      *  ESC,'M','L','1',        !COLOR 1
  3269.      *  ESC,'N','U',':',        !BYPASS CANCEL CHARACTER (LF)
  3270.      *  ESC,'N','T','1','=',0/    !EOL STRING <CR> <NULL>
  3271.     DATA STR_WINDOW / ESC,'R','W',0/
  3272.     DATA STR_BEGIN_PLOT/ESC,FF,0/
  3273.     DATA STR_END_PLOT /esc,eb,0/
  3274.     DATA unreserve /ESC,'Q','R','0',0/
  3275.     DATA endpanel /ESC,'L','E',0/
  3276.  
  3277. C    DEFINITIONS FOR GIN
  3278.     BYTE GINBUFR(8), PROMPT(4), STR_END_GIN(2), STR_MOVE_GIN_CURSOR(6)
  3279.     DATA PROMPT /ESC, CSUB, 0, 0/
  3280.     DATA IGIN_IN_CHARS /6/
  3281.     DATA STR_END_GIN /10,0/
  3282.     DATA STR_MOVE_GIN_CURSOR / ESC, 'S', 'X', '0', 0,0/
  3283.     DATA IX_GIN_CURSOR, IY_GIN_CURSOR / IX_CENTER, IY_CENTER /
  3284.  
  3285. C    DECLARE BUFFERING FUNCTION
  3286.     LOGICAL GB_TEST_FLUSH
  3287.  
  3288. C    DECLARE VARS NEED FOR DRIVER OPERATION
  3289.     LOGICAL LVECTOR_GOING, LDUMMY
  3290.     DIMENSION DCHAR(8)
  3291.  
  3292. c  "GUPCM" IS GRAPHICS UNITS PER CENTIMETER
  3293.       EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  3294.       DATA DCHAR / TERM_NUMBER, XLENGTH, YLENGTH, RESOLUTION,
  3295.      *  RESOLUTION, COLORS_FG, 389.0, 1.0/
  3296.  
  3297. C*****************
  3298.       tall = .false.
  3299. 10    IF (IFXN .GT. 1026) GOTO 1000
  3300.       IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  3301.       GO TO (100,200,300,400,500,600,700,800,900) IFXN
  3302.  
  3303. c  *********************
  3304. c  INITIALIZE
  3305. 100    CALL GB_INITIALIZE (0,STR_END,TERMINAL,IERR)
  3306.     YA(1) = IERR
  3307.     IF (IERR .NE. 0) RETURN
  3308.  
  3309.     CALL GB_IN_STRING (STR_INIT_DEV)
  3310.     CALL GB_EMPTY
  3311.     LVECTOR_GOING = .FALSE.
  3312.     RETURN
  3313.  
  3314. C    **************************
  3315. C    GET FRESH PLOTTING SURFACE
  3316. 200    CONTINUE
  3317.     CALL GB_NEW_BUFFER
  3318.     CALL GB_IN_STRING (STR_BEGIN_PLOT)
  3319.     CALL GB_EMPTY
  3320.     LVECTOR_GOING = .FALSE.
  3321.     RETURN
  3322.  
  3323. C    ****
  3324. C    MOVE
  3325. 300    CONTINUE
  3326. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  3327.       if (tall) then
  3328.     IxPOSN = xdm1 -tallx*YA(1)+0.5
  3329.     IyPOSN = tally*XA(1)+0.5
  3330.       else
  3331.     IXPOSN = XGUPCM*XA(1)+0.5
  3332.     IYPOSN = YGUPCM*YA(1)+0.5
  3333.       endif
  3334.       LVECTOR_GOING = .FALSE.
  3335.       RETURN
  3336.  
  3337. C    ****
  3338. C    DRAW
  3339. 400    CONTINUE
  3340.       if (tall) then
  3341.     Ix = xdm1 -tallx*YA(1)+0.5
  3342.     Iy = tally*XA(1)+0.5
  3343.       else
  3344.     IX = XGUPCM*XA(1)+0.5
  3345.     IY = YGUPCM*YA(1)+0.5
  3346.       endif
  3347.       LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  3348.       IF (.not.LVECTOR_GOING) then
  3349.         LDUMMY = GB_TEST_FLUSH(9)
  3350.         LVECTOR_GOING = .TRUE.
  3351.         CALL GB_INSERT (GS)
  3352.         CALL xyto4692 (IXPOSN,IYPOSN)
  3353.       endif
  3354.       CALL xyto4692 (IX,IY)
  3355.       IXPOSN = IX
  3356.       IYPOSN = IY
  3357.       RETURN
  3358.  
  3359. C    *****************************
  3360. C    FLUSH GRAPHICS COMMAND BUFFER
  3361. 500    CONTINUE
  3362.     CALL GB_EMPTY
  3363.     CALL GB_IN_STRING (STR_END_PLOT)
  3364.     CALL GB_EMPTY
  3365.     LVECTOR_GOING = .FALSE.
  3366.     RETURN
  3367.  
  3368. C    ******************
  3369. C    RELEASE THE DEVICE
  3370. 600    CONTINUE
  3371.  
  3372. C    DE-ASSIGN THE CHANNAL
  3373.     CALL GB_EMPTY
  3374.     CALL GB_FINISH (unreserve)
  3375.     CALL GB_EMPTY
  3376.       call sys$dalloc (namdev)
  3377.     RETURN
  3378.  
  3379. C    *****************************
  3380. C    RETURN DEVICE CHARACTERISTICS
  3381. 700    CONTINUE
  3382.     DO 720 I=1,8
  3383.     XA(I) = DCHAR(I)
  3384. 720    CONTINUE
  3385.     RETURN
  3386.  
  3387. C    ****************************
  3388. C    SELECT CURRENT DRAWING COLOR
  3389. 800   LDUMMY = GB_TEST_FLUSH(24)
  3390.       call gb_in_string (lineindex)
  3391.       call intto4692 (xa(1))
  3392.       call gb_in_string (textindex)
  3393.       call intto4692 (xa(1))
  3394.       call gb_in_string (fillpattern)
  3395.       call intto4692 (xa(1))
  3396.       LVECTOR_GOING = .FALSE.
  3397.       RETURN
  3398.  
  3399. c  **********************
  3400. c  PERFORM GRAPHICS INPUT
  3401. 900   RETURN
  3402.  
  3403. c  *******************
  3404. c  DRAW FILLED POLYGON
  3405. 1000  ldummy = gb_test_flush (11)
  3406.       CALL GB_IN_STRING (beginpanel)
  3407.       if (tall) then
  3408.     Ix = xdm1 -tallx*YA(1)+0.5
  3409.     Iy = tally*XA(1)+0.5
  3410.       else
  3411.     IX = XGUPCM*XA(1)+0.5
  3412.     IY = YGUPCM*YA(1)+0.5
  3413.       endif
  3414.       call xyto4692 (ix,iy)
  3415.       call gb_insert ('0')
  3416.       call gb_insert (gs)
  3417.       LVECTOR_GOING = .FALSE.
  3418.       NPTS = IFXN - 1024
  3419.       DO 1010 I = 2, NPTS
  3420.       LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(5))
  3421.       IF (.NOT. LVECTOR_GOING) then
  3422.         ldummy = gb_test_flush (11)
  3423.         lvector_going = .true.
  3424.         CALL GB_INSERT(GS)
  3425.       endif
  3426.       if (tall) then
  3427.     Ix = xdm1 -tallx*YA(i)+0.5
  3428.     Iy = tally*XA(i)+0.5
  3429.       else
  3430.     IX = XGUPCM*XA(i)+0.5
  3431.     IY = YGUPCM*YA(i)+0.5
  3432.       endif
  3433. 1010  call xyto4692 (ix,iy)
  3434.       CALL GB_IN_STRING (endpanel)
  3435.       LVECTOR_GOING = .FALSE.
  3436.       RETURN
  3437.  
  3438. c******************************************************************************
  3439.       entry GD4692n (IFXN,XA,YA)
  3440. c  Tektronix 4692 narrow driver.
  3441.  
  3442.       tall = .true.
  3443.       go to 10
  3444.       END
  3445.  
  3446. c******************************************************************************
  3447. c******************************************************************************
  3448.       subroutine intto4692 (f)
  3449. c  insert char(f) into buffer.
  3450.       byte ic(5)
  3451.  
  3452.       i = abs(f)
  3453.       ic(4) = mod(i,2**4) +2**5
  3454.       if (f.ge..0) ic(4) = ic(4) +2**4
  3455.       ic(3) = mod(i/(2**4),2**6) +64
  3456.       ic(2) = mod(i/(2**10),2**6) +64
  3457.       ic(1) = mod(i/(2**16),2**6) +64
  3458.       n = 4
  3459.       if (ic(3).ne.64) n = 3
  3460.       if (ic(2).ne.64) n = 2
  3461.       if (ic(1).ne.64) n = 1
  3462.       call gb_in_string (ic(n))
  3463.       return
  3464.       end
  3465.  
  3466. c******************************************************************************
  3467. c******************************************************************************
  3468.       subroutine xyto4692 (ix,iy)
  3469. c  convert (ix,iy) to Tektronix 4692 code.
  3470.  
  3471.       call gb_insert (32 +iy/128)
  3472.       call gb_insert (96 +mod(ix,4) +4*mod(iy,4))
  3473.       call gb_insert (96 +mod(iy/4,32))
  3474.       call gb_insert (32 +ix/128)
  3475.       call gb_insert (64 +mod(ix/4,32))
  3476.       return
  3477.       end
  3478.     SUBROUTINE GD550(IFXN,XA,YA)
  3479.     DIMENSION XA(8), YA(3)
  3480. C
  3481. C    Visual 550 DRIVER FOR DIGLIB/VAX V3.
  3482. C    Modified so a scrolling    window is set at the top of the
  3483. C    screen for user interaction.
  3484. C    Joe P. Garbarini Jr.  30-May-1984
  3485. C
  3486. C---------------------------------------------------------------------------
  3487. C
  3488.     BYTE ESC, CSUB, GS, US, CR, FF
  3489.     BYTE CAN
  3490.     PARAMETER (ESC=27, CSUB=26, GS=29, US=31, CR=13, FF=12)
  3491.     PARAMETER (CAN=24)
  3492.     CHARACTER*(*) TERMINAL
  3493.     PARAMETER (TERMINAL='TT')
  3494. C
  3495. C    DEFINITIONS FOR DEVICE CONTROL
  3496. C
  3497.     BYTE STR_END(2)
  3498.     DATA STR_END /CAN,0/
  3499. C
  3500.     BYTE STR_BEGIN_PLOT(8)
  3501.     DATA STR_BEGIN_PLOT /ESC,FF,ESC,'/','1','h',2*0/
  3502. C
  3503.     BYTE STR_COLOR_SET(6)
  3504.     DATA STR_COLOR_SET /ESC,'/','0','d',2*0/
  3505. C
  3506.     LOGICAL*1 V_300(6)
  3507.     LOGICAL*1 V_CAN(2),V_BOTH(6),V_ERA(6),V_SCR(10),V_1TO1(6)
  3508.     DATA V_300  /ESC,'[','?','2','h',0/
  3509.     DATA V_CAN  /CAN, 0/
  3510.     DATA V_BOTH /ESC,'[','?','5','v',0/
  3511.     DATA V_ERA  /ESC,'[','2','J',0, 0/
  3512.     DATA V_SCR  /ESC,'[','1',';','4','r',4*0/
  3513. C
  3514. C    DEFINITIONS FOR GIN
  3515. C
  3516.     BYTE GINBUFR(8), PROMPT(4)
  3517.     DATA PROMPT /ESC, CSUB, 2*0/
  3518.     DATA IGIN_IN_CHARS /5/
  3519. C
  3520. C    DECLARE BUFFERING FUNCTION
  3521. C
  3522.     LOGICAL GB_TEST_FLUSH
  3523. C
  3524. C    DECLARE VARS NEED FOR DRIVER OPERATION
  3525. C
  3526.     LOGICAL LVECTOR_GOING, LDUMMY
  3527.     DIMENSION DCHAR(8)
  3528. C
  3529. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  3530. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  3531. C
  3532.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  3533. CC
  3534. C    FULL SCREEN
  3535. C    DATA DCHAR /550.0,23.36,17.79,32.88,32.88,1.0,133.0,1.0/
  3536. CC
  3537. C    SPLIT SCREEN
  3538. C
  3539.     DATA DCHAR /550.0,23.36,15.69,32.88,32.88,1.0,133.0,1.0/
  3540. CC
  3541. C
  3542. C*****************
  3543. C
  3544. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  3545. C
  3546.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  3547. C
  3548. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  3549. C
  3550.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  3551. C
  3552. C    *********************
  3553. C    INITIALIZE THE DEVICE
  3554. C    *********************
  3555. C
  3556. 100    CONTINUE
  3557. C
  3558. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  3559. C
  3560.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  3561.     YA(1) = IERR
  3562.     IF (IERR .NE. 0) RETURN
  3563.     LVECTOR_GOING = .FALSE.
  3564. C
  3565. C    SET UP THE SPLIT SCREEN
  3566. C
  3567.     CALL GB_IN_STRING(V_CAN)
  3568.     CALL GB_IN_STRING(V_300)
  3569.     CALL GB_IN_STRING(V_BOTH)
  3570.     CALL GB_IN_STRING(V_ERA)
  3571.     CALL GB_IN_STRING(V_SCR)
  3572.     CALL GB_EMPTY
  3573. C
  3574.     RETURN
  3575. C
  3576. C    **************************
  3577. C    GET FRESH PLOTTING SURFACE
  3578. C    **************************
  3579. C
  3580. 200    CONTINUE
  3581.     CALL GB_EMPTY
  3582.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  3583.     CALL GB_EMPTY
  3584.     LVECTOR_GOING = .FALSE.
  3585.     RETURN
  3586. C
  3587. C    ****
  3588. C    MOVE
  3589. C    ****
  3590. C
  3591. 300    CONTINUE
  3592. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  3593.     IXPOSN = XGUPCM*XA(1)+0.5
  3594.     IYPOSN = YGUPCM*YA(1)+0.5
  3595.     LVECTOR_GOING = .FALSE.
  3596.     RETURN
  3597. C
  3598. C    ****
  3599. C    DRAW
  3600. C    ****
  3601. C
  3602. 400    CONTINUE
  3603.     IX = XGUPCM*XA(1)+0.5
  3604.     IY = YGUPCM*YA(1)+0.5
  3605.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  3606.     IF (LVECTOR_GOING) GO TO 410
  3607.     LDUMMY = GB_TEST_FLUSH(9)
  3608.     LVECTOR_GOING = .TRUE.
  3609.     CALL GB_INSERT(GS)
  3610.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  3611. 410    CALL GD_4010_CONVERT(IX,IY)
  3612.     IXPOSN = IX
  3613.     IYPOSN = IY
  3614.     RETURN
  3615. C
  3616. C    *****************************
  3617. C    FLUSH GRAPHICS COMMAND BUFFER
  3618. C    *****************************
  3619. C
  3620. 500    CONTINUE
  3621.     CALL GB_EMPTY
  3622.     CALL GB_INSERT(GS)
  3623.     CALL GD_4010_CONVERT(0,584)
  3624.     CALL GB_EMPTY
  3625.     LVECTOR_GOING = .FALSE.
  3626.     RETURN
  3627. C
  3628. C    ******************
  3629. C    RELEASE THE DEVICE
  3630. C    ******************
  3631. C
  3632. 600    CONTINUE
  3633. C
  3634. C    DE-ASSIGN THE CHANNAL
  3635. C
  3636.     CALL GB_FINISH(0)
  3637.     RETURN
  3638. C
  3639. C    *****************************
  3640. C    RETURN DEVICE CHARACTERISTICS
  3641. C    *****************************
  3642. C
  3643. 700    CONTINUE
  3644.     DO 720 I=1,8
  3645.     XA(I) = DCHAR(I)
  3646. 720    CONTINUE
  3647.     RETURN
  3648. C
  3649. C    ****************************
  3650. C    SELECT CURRENT DRAWING COLOR
  3651. C    ****************************
  3652. C
  3653. 800    CONTINUE
  3654.     CALL GB_EMPTY
  3655.     ICOLOR = XA(1)
  3656.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  3657.     IF (ICOLOR .EQ. 1) THEN
  3658.       STR_COLOR_SET(3) = 48
  3659.     ELSE
  3660.       STR_COLOR_SET(3) = 49
  3661.     ENDIF
  3662.     CALL GB_INSERT(GS)
  3663.     CALL GB_IN_STRING(STR_COLOR_SET)
  3664.     CALL GB_EMPTY
  3665.     LVECTOR_GOING = .FALSE.
  3666.     RETURN
  3667. C
  3668. C    **********************
  3669. C    PERFORM GRAPHICS INPUT
  3670. C    **********************
  3671. C
  3672. 900    CONTINUE
  3673.     CALL GB_EMPTY
  3674.     LVECTOR_GOING = .FALSE.
  3675. C
  3676. C    ASK FOR 1 GIN INPUT
  3677. C
  3678. C
  3679.     CALL GB_SEND_CHARS(GS,1)
  3680.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  3681. C
  3682.     ICHAR = GINBUFR(1)
  3683.     IX1 = GINBUFR(2)
  3684.     IX2 = GINBUFR(3)
  3685.     IY1 = GINBUFR(4)
  3686.     IY2 = GINBUFR(5)
  3687. C
  3688.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  3689.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  3690.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  3691. C
  3692.     CALL GB_SEND_CHARS(CAN,1)
  3693. C
  3694.     RETURN
  3695.     END
  3696.     SUBROUTINE GD9400(IFXN,XA,YA)
  3697.     DIMENSION XA(8), YA(3)
  3698. C
  3699. C    RAMTEK 9400 (WITHOUT LUT) DRIVER FOR DIGLIB/VAX
  3700. C        CURRENTLY CONFIGURED FOR 640X512
  3701. C
  3702. C-----------------------------------------------------------------------
  3703. C
  3704.     PARAMETER (MAXY=511)
  3705.     PARAMETER (IBUFFER_SIZE=256)
  3706.     CHARACTER*(*) DEVICE_NAME
  3707.     PARAMETER (DEVICE_NAME='_RAM0:')
  3708.     INTEGER*2 IWVL_AND_OP1, IWVL_PLAIN, ICOP_AND_FOREGROUND
  3709.     PARAMETER (IWVL_AND_OP1 = '0E03'X)
  3710.     PARAMETER (IWVL_PLAIN = '0E01'X)
  3711.     PARAMETER (ICOP_AND_FOREGROUND = '8002'X)
  3712.     DIMENSION DCHAR(8)
  3713.     INTEGER*4 SYS$ASSIGN, SYS$QIOW, SYS$DASSGN
  3714.     INTEGER*2 IOCHANTT, IX, IY, ICURRENT_COLOR, ICOLOR_MAP(0:7)
  3715.     INTEGER*2 BUFFER(IBUFFER_SIZE), IOCHAN
  3716.     INTEGER*2 INIT_RAMTEK(4), IERASE_RAMTEK
  3717.     INTEGER*2 IWRITE_CURSOR(3), IREAD_CURSOR
  3718.     LOGICAL*2 LMOVED
  3719.     BYTE CHARBUFR
  3720.     SAVE DCHAR, IOREADNOECHO
  3721.     SAVE IOCHAN, IOCHANTT, BUFFER, IBUFFER_POINTER, INITIAL_POINTER
  3722.     SAVE ICOLOR_MAP, ICURRENT_COLOR, IXPOSN, IYPOSN, LMOVED
  3723.     SAVE INIT_RAMTEK, INIT_BYTES, IERASE_RAMTEK, IERASE_BYTES
  3724.     SAVE IWRITE_CURSOR, IREAD_CURSOR, IOREADLBLK
  3725. C
  3726. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  3727. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  3728. C
  3729.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  3730. C
  3731. C    DATA WE WILL NEED
  3732. C
  3733.     DATA DCHAR /9400.0, 32.803, 26.232, 19.48, 19.48, 15.0, 149.0, 1.0/
  3734.     DATA ICOLOR_MAP / 0, 7, 1, 2, 4, 3, 5, 6 /
  3735.     DATA IOREADNOECHO /'00000071'X/
  3736.     DATA INIT_RAMTEK /'0600'X, '3300'X, 1, '3400'X/
  3737.     DATA INIT_BYTES /8/
  3738.     DATA IERASE_RAMTEK /'0900'X/
  3739.     DATA IERASE_BYTES /2/
  3740.     DATA IWRITE_CURSOR /'2C00'X, 320, 256/
  3741.     DATA IREAD_CURSOR /'2E00'X/
  3742.     DATA IWRITE_BYTES, IREAD_BYTES / 6, 2/
  3743.     DATA IOREADLBLK /'00000021'X/
  3744. C
  3745. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  3746. C
  3747.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  3748. C
  3749. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  3750. C
  3751.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  3752. C
  3753. C    *********************
  3754. C    INITIALIZE THE DEVICE
  3755. C    *********************
  3756. C
  3757. 100    CONTINUE
  3758. C
  3759. C    FIND THE I/O CHANNAL ASSICIATED WITH THE TERMINAL FOR DOING GINS
  3760. C
  3761.     ISTAT = SYS$ASSIGN(DEVICE_NAME,IOCHAN,,)
  3762. D    TYPE *,'DEVICE NAME ASSIGNMENT STATUS IS ',ISTAT
  3763.     IF (.NOT. ISTAT) THEN
  3764.         YA(1) = 1.0
  3765.         RETURN
  3766.     ENDIF
  3767.     ISTAT = SYS$ASSIGN('TT',IOCHANTT,,)
  3768. D    TYPE *,'ASSIGN STATUS IS ',ISTAT
  3769.     IF (.NOT. ISTAT) THEN
  3770.         YA(1) = 2.0
  3771.         RETURN
  3772.         ELSE
  3773.         YA(1) = 0.0
  3774.     ENDIF
  3775. C
  3776. C    INITIALIZE THE RAMTEK
  3777. C
  3778.     CALL GD94WRITE(INIT_RAMTEK,INIT_BYTES,IOCHAN)
  3779. 190    ICURRENT_COLOR = ICOLOR_MAP(1)
  3780.     LMOVED = .TRUE.
  3781.     IBUFFER_POINTER = 1
  3782.     RETURN
  3783. C
  3784. C    **************************
  3785. C    GET FRESH PLOTTING SURFACE
  3786. C    **************************
  3787. C
  3788. 200    CONTINUE
  3789. C
  3790. C    ERASE THE RAMTEK SCREEN AND RETURN TO NORMAL
  3791. C
  3792.     CALL GD94WRITE(IERASE_RAMTEK, IERASE_BYTES, IOCHAN)
  3793.     GO TO 190
  3794. C
  3795. C    ****
  3796. C    MOVE
  3797. C    ****
  3798. C
  3799. 300    CONTINUE
  3800. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  3801.     IXPOSN = XGUPCM*XA(1)+0.5
  3802.     IYPOSN = MAXY - INT(YGUPCM*YA(1)+0.5)
  3803.     LMOVED = .TRUE.
  3804.     RETURN
  3805. C
  3806. C    ****
  3807. C    DRAW
  3808. C    ****
  3809. C
  3810. 400    CONTINUE
  3811.     IX = XGUPCM*XA(1)+0.5
  3812.     IY = MAXY - INT(YGUPCM*YA(1)+0.5)
  3813.     IF (.NOT. LMOVED) GO TO 450
  3814.     IF (IBUFFER_POINTER .LT. (IBUFFER_SIZE-10)) GO TO 420
  3815.     CALL GD94WRITE(BUFFER,2*(IBUFFER_POINTER-1),IOCHAN)
  3816.     IBUFFER_POINTER = 1
  3817. 420    BUFFER(IBUFFER_POINTER) = IWVL_AND_OP1
  3818.     BUFFER(IBUFFER_POINTER+1) = ICOP_AND_FOREGROUND
  3819.     BUFFER(IBUFFER_POINTER+2) = ICURRENT_COLOR
  3820.     BUFFER(IBUFFER_POINTER+3) = IXPOSN
  3821.     BUFFER(IBUFFER_POINTER+4) = IYPOSN
  3822.     BUFFER(IBUFFER_POINTER+5) = 0
  3823.     INDEX_NBYTES = IBUFFER_POINTER + 5
  3824.     IBUFFER_POINTER = IBUFFER_POINTER + 6
  3825.     LMOVED = .FALSE.
  3826.     GO TO 460
  3827. 450    IF (IBUFFER_POINTER .LE. (IBUFFER_SIZE-2)) GO TO 460
  3828.     CALL GD94WRITE(BUFFER,2*(IBUFFER_POINTER-1),IOCHAN)
  3829.     IBUFFER_POINTER = 3
  3830.     BUFFER(1) = IWVL_PLAIN
  3831.     BUFFER(2) = 0
  3832.     INDEX_NBYTES = 2
  3833. 460    BUFFER(IBUFFER_POINTER) = IX
  3834.     BUFFER(IBUFFER_POINTER+1) = IY
  3835.     IBUFFER_POINTER = IBUFFER_POINTER+2
  3836.     IXPOSN = IX
  3837.     IYPOSN = IY
  3838. C
  3839. C    COUNT BYTES OF DATA
  3840. C
  3841.     BUFFER(INDEX_NBYTES) = BUFFER(INDEX_NBYTES) + 4
  3842.     RETURN
  3843. C
  3844. C    *****************************
  3845. C    FLUSH GRAPHICS COMMAND BUFFER
  3846. C    *****************************
  3847. C
  3848. 500    CONTINUE
  3849.     IF (IBUFFER_POINTER .EQ. 1) RETURN
  3850.     CALL GD94WRITE(BUFFER,2*(IBUFFER_POINTER-1),IOCHAN)
  3851.     IBUFFER_POINTER = 1
  3852.     LMOVED = .TRUE.
  3853.     RETURN
  3854. C
  3855. C    ******************
  3856. C    RELEASE THE DEVICE
  3857. C    ******************
  3858. C
  3859. 600    CONTINUE
  3860. C
  3861. C    DE-ASSIGN THE CHANNALS
  3862. C
  3863.     ISTAT = SYS$DASSGN(%VAL(IOCHAN))
  3864.     ISTAT = SYS$DASSGN(%VAL(IOCHANTT))
  3865.     RETURN
  3866. C
  3867. C    *****************************
  3868. C    RETURN DEVICE CHARACTERISTICS
  3869. C    *****************************
  3870. C
  3871. 700    CONTINUE
  3872.     DO 720 I=1,8
  3873.     XA(I) = DCHAR(I)
  3874. 720    CONTINUE
  3875.     RETURN
  3876. C
  3877. C    ****************************
  3878. C    SELECT CURRENT DRAWING COLOR
  3879. C    ****************************
  3880. C
  3881. 800    CONTINUE
  3882.     ICOLOR = ICOLOR_MAP(INT(XA(1)))
  3883.     IF (ICOLOR .EQ. ICURRENT_COLOR) RETURN
  3884.     ICURRENT_COLOR = ICOLOR
  3885.     LMOVED = .TRUE.
  3886.     RETURN
  3887. C
  3888. C    **********************
  3889. C    PERFORM GRAPHICS INPUT
  3890. C    **********************
  3891. C
  3892. 900    CONTINUE
  3893.     IF (IBUFFER_POINTER .EQ. 1) GO TO 910
  3894.     CALL GD94WRITE(BUFFER,2*(IBUFFER_POINTER-1),IOCHAN)
  3895.     IBUFFER_POINTER = 1
  3896.     LMOVED = .TRUE.
  3897. C
  3898. C    SET VISIBLE BIT TO MAKE CURSOR VISIBLE
  3899. C
  3900. 910    IWRITE_CURSOR(3) = IOR(IWRITE_CURSOR(3),'0400'X)
  3901. C
  3902. C    BRING UP CURSOR AT LAST KNOWN LOCATION
  3903. C
  3904.     CALL GD94WRITE(IWRITE_CURSOR, IWRITE_BYTES, IOCHAN)
  3905. C
  3906. C    ASK FOR 1 CHARACTER FROM THE TERMINAL
  3907. C
  3908.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHANTT),%VAL(IOREADNOECHO),
  3909.     1   IOSB, , ,CHARBUFR,%VAL(1), , , , )
  3910.     IF (.NOT. ISTAT) STOP 'GD9400 - GIN FAILURE'
  3911. C
  3912. C    TELL 9400 WE WANT TO READ THE CURSOR
  3913. C
  3914.     CALL GD94WRITE(IREAD_CURSOR, IREAD_BYTES, IOCHAN)
  3915. C
  3916. C    READ THE CURSOR LOCATION INTO THE "WRITE CURSOR" AREA SO THE NEXT
  3917. C    "WRITE CURSOR" WILL PLACE THE CURSOR AT THIS NEW LOCATION.
  3918. C
  3919.     ISTAT = SYS$QIOW(%VAL(0), %VAL(IOCHAN), %VAL(IOREADLBLK),
  3920.     1   IOSB, , ,IWRITE_CURSOR(2), %VAL(4), , , , )
  3921.     IF (.NOT. ISTAT) STOP 'GD9400 - RAMTEK READ ERROR'
  3922. D    TYPE *,'CURSOR LOCATION ',IWRITE_CURSOR(2), IWRITE_CURSOR(3)
  3923. C
  3924. C    GET THE KEY, X POSITION, AND Y POSITION
  3925. C
  3926.     XA(1) = CHARBUFR        !PICK CHARACTER
  3927.     IWRITE_CURSOR(2) = IAND(IWRITE_CURSOR(2), '07FF'X)
  3928.     IWRITE_CURSOR(3) = IAND(IWRITE_CURSOR(3), '03FF'X)
  3929.     XA(2) = FLOAT(IWRITE_CURSOR(2))/XGUPCM    !X IN CENTIMETERS.
  3930.     XA(3) = FLOAT(MAXY-IWRITE_CURSOR(3))/YGUPCM    !Y IN CM.
  3931. C
  3932. C    MAKE THE CURSOR INVISIBLE
  3933. C
  3934.     CALL GD94WRITE(IWRITE_CURSOR, IWRITE_BYTES, IOCHAN)
  3935.     RETURN
  3936.     END
  3937.     SUBROUTINE GD94WRITE(BUFFER,NBYTES,IOCHAN)
  3938. C
  3939. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  3940. C
  3941.     INTEGER*2 BUFFER(NBYTES/2)
  3942.     INTEGER*2 IOSB(4)
  3943.     INTEGER*4 SYS$QIOW
  3944.     SAVE IOWRITE
  3945.     DATA IOWRITE /'00000020'X/
  3946. D    TYPE 9999, NBYTES, (BUFFER(I), BUFFER(I), I=1,NBYTES/2)
  3947. D9999    FORMAT(' GD9400WRITE'/' BYTE COUNT IS ',I6/
  3948. D    1   128(1X,Z4,'H',4X,O6/))
  3949.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IOWRITE),
  3950.     1   IOSB, , ,BUFFER,%VAL(NBYTES), , , , )
  3951. D    TYPE *,'GD9400 WRITE STATUS IS ',ISTAT
  3952.     IF (.NOT. ISTAT) STOP 'GD9400 - WRITE ERROR'
  3953.     RETURN
  3954.     END
  3955.  
  3956.     SUBROUTINE GD9400LUT(IFXN,XA,YA)
  3957.     DIMENSION XA(8), YA(3)
  3958. C
  3959. C    RAMTEK 9400 WITH LUT DRIVER FOR DIGLIB/VAX
  3960. C        CURRENTLY CONFIGURED FOR 1280x1024 AND TYPE 7A LUT
  3961. C
  3962. C-----------------------------------------------------------------------
  3963. C
  3964.     PARAMETER (MAXY=1023)
  3965.     CHARACTER*(*) DEVICE_NAME
  3966.     PARAMETER (DEVICE_NAME='RAA0:')
  3967.  
  3968. C    **********
  3969.     INTEGER*2 IOCHAN
  3970.     COMMON /GD9400_IO/ IOCHAN
  3971. C    **********
  3972.  
  3973.     DIMENSION DCHAR(8)
  3974.  
  3975.     INTEGER*4 SYS$ASSIGN, SYS$QIOW, SYS$DASSGN
  3976.     INTEGER*2 IOCHANTT
  3977.  
  3978.     INTEGER*2 INIT_RAMTEK(19), IERASE_RAMTEK
  3979.     INTEGER*2 IWRITE_CURSOR(3), IREAD_CURSOR
  3980.     INTEGER*2 LOAD_LUT(7)
  3981.     BYTE CHARBUFR
  3982. C
  3983. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  3984. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  3985. C
  3986.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  3987. C
  3988. C    DATA WE WILL NEED
  3989. C
  3990.     DATA DCHAR /9400.9, 32.8285, 26.258, 38.96, 38.96, 255.0, 213.0, 1.0/
  3991.     DATA IOREADNOECHO /'00000071'X/
  3992.     DATA INIT_RAMTEK /'0600'X, '2700'X, '3300'X, 1, '3400'X, '0300'X, 0,
  3993.     1   16, 0, 4095, 3840, 240, 15, 4080, 3855, 255, '0300'X, 0, 0/
  3994.     DATA INIT_BYTES /38/
  3995.     DATA IERASE_RAMTEK /'2B00'X/
  3996.     DATA IERASE_BYTES /2/
  3997.     DATA IWRITE_CURSOR /'2C01'X, 320, 256/
  3998.     DATA IREAD_CURSOR /'2E01'X/
  3999.     DATA IWRITE_BYTES, IREAD_BYTES / 6, 2/
  4000.     DATA IOREADLBLK /'00000021'X/
  4001.     DATA LOAD_LUT /'0300'X, 0, 0, 0, '0300'X, 0, 0/
  4002.     DATA LOAD_LUT_BYTES /14/
  4003. C
  4004. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  4005. C
  4006.     IF (IFXN .LE. 0 .OR. IFXN .GT. 10) RETURN
  4007. C
  4008. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  4009. C
  4010.     GO TO (100,200,300,300,500,600,700,800,900,1000) IFXN
  4011. C
  4012. C    *********************
  4013. C    INITIALIZE THE DEVICE
  4014. C    *********************
  4015. C
  4016. 100    CONTINUE
  4017. C
  4018. C    FIND THE I/O CHANNAL ASSICIATED WITH THE TERMINAL FOR DOING GINS
  4019. C
  4020.     ISTAT = SYS$ASSIGN(DEVICE_NAME,IOCHAN,,)
  4021. D    TYPE *,'DEVICE NAME ASSIGNMENT STATUS IS ',ISTAT
  4022.     IF (.NOT. ISTAT) THEN
  4023.         YA(1) = 1.0
  4024.         RETURN
  4025.     ENDIF
  4026.     ISTAT = SYS$ASSIGN('TT',IOCHANTT,,)
  4027. D    TYPE *,'ASSIGN STATUS IS ',ISTAT
  4028.     IF (.NOT. ISTAT) THEN
  4029.         YA(1) = 2.0
  4030.         RETURN
  4031.         ELSE
  4032.         YA(1) = 0.0
  4033.     ENDIF
  4034. C
  4035. C    INITIALIZE THE RAMTEK
  4036. C
  4037.     CALL GD94WRITE(INIT_RAMTEK,INIT_BYTES)
  4038. 190    CALL GD9400_BUFRINIT
  4039.     RETURN
  4040. C
  4041. C    **************************
  4042. C    GET FRESH PLOTTING SURFACE
  4043. C    **************************
  4044. C
  4045. 200    CONTINUE
  4046. C
  4047. C    ERASE THE RAMTEK SCREEN AND RETURN TO NORMAL
  4048. C
  4049.     CALL GD94WRITE(IERASE_RAMTEK, IERASE_BYTES)
  4050.     GO TO 190
  4051. C
  4052. C    *************
  4053. C    MOVE AND DRAW
  4054. C    *************
  4055. C
  4056. 300    CONTINUE
  4057. C
  4058. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  4059. C
  4060.     IX = XGUPCM*XA(1) + 0.5
  4061.     IY = MAXY - INT(YGUPCM*YA(1) + 0.5)
  4062.     IF (IFXN .EQ. 3) THEN
  4063.         CALL GD9400_MOVE(IX,IY)
  4064.         ELSE
  4065.         CALL GD9400_DRAW(IX,IY)
  4066.     ENDIF
  4067.     RETURN
  4068. C
  4069. C    *****************************
  4070. C    FLUSH GRAPHICS COMMAND BUFFER
  4071. C    *****************************
  4072. C
  4073. 500    CONTINUE
  4074.     CALL GD9400_FLUSH
  4075.     RETURN
  4076. C
  4077. C    ******************
  4078. C    RELEASE THE DEVICE
  4079. C    ******************
  4080. C
  4081. 600    CONTINUE
  4082. C
  4083. C    DE-ASSIGN THE CHANNALS
  4084. C
  4085.     ISTAT = SYS$DASSGN(%VAL(IOCHAN))
  4086.     ISTAT = SYS$DASSGN(%VAL(IOCHANTT))
  4087.     RETURN
  4088. C
  4089. C    *****************************
  4090. C    RETURN DEVICE CHARACTERISTICS
  4091. C    *****************************
  4092. C
  4093. 700    CONTINUE
  4094.     DO 720 I=1,8
  4095.     XA(I) = DCHAR(I)
  4096. 720    CONTINUE
  4097.     RETURN
  4098. C
  4099. C    ****************************
  4100. C    SELECT CURRENT DRAWING COLOR
  4101. C    ****************************
  4102. C
  4103. 800    CONTINUE
  4104.     CALL GD9400_COLOR_SET(INT(XA(1)))
  4105.     RETURN
  4106. C
  4107. C    **********************
  4108. C    PERFORM GRAPHICS INPUT
  4109. C    **********************
  4110. C
  4111. 900    CONTINUE
  4112.     CALL GD9400_FLUSH
  4113. C
  4114. C    SET VISIBLE BIT TO MAKE CURSOR VISIBLE
  4115. C
  4116. 910    IWRITE_CURSOR(3) = IOR(IWRITE_CURSOR(3),'0400'X)
  4117. C
  4118. C    BRING UP CURSOR AT LAST KNOWN LOCATION
  4119. C
  4120.     CALL GD94WRITE(IWRITE_CURSOR, IWRITE_BYTES)
  4121. C
  4122. C    ASK FOR 1 CHARACTER FROM THE TERMINAL
  4123. C
  4124.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHANTT),%VAL(IOREADNOECHO),
  4125.     1   IOSB, , ,CHARBUFR,%VAL(1), , , , )
  4126.     IF (.NOT. ISTAT) STOP 'GD9400 - GIN FAILURE'
  4127. C
  4128. C    TELL 9400 WE WANT TO READ THE CURSOR
  4129. C
  4130.     CALL GD94WRITE(IREAD_CURSOR, IREAD_BYTES)
  4131. C
  4132. C    READ THE CURSOR LOCATION INTO THE "WRITE CURSOR" AREA SO THE NEXT
  4133. C    "WRITE CURSOR" WILL PLACE THE CURSOR AT THIS NEW LOCATION.
  4134. C
  4135.     ISTAT = SYS$QIOW(%VAL(0), %VAL(IOCHAN), %VAL(IOREADLBLK),
  4136.     1   IOSB, , ,IWRITE_CURSOR(2), %VAL(4), , , , )
  4137.     IF (.NOT. ISTAT) STOP 'GD9400 - RAMTEK READ ERROR'
  4138. D    TYPE *,'CURSOR LOCATION ',IWRITE_CURSOR(2), IWRITE_CURSOR(3)
  4139. C
  4140. C    GET THE KEY, X POSITION, AND Y POSITION
  4141. C
  4142.     XA(1) = CHARBUFR        !PICK CHARACTER
  4143.     IWRITE_CURSOR(2) = IAND(IWRITE_CURSOR(2), '07FF'X)
  4144.     IWRITE_CURSOR(3) = IAND(IWRITE_CURSOR(3), '03FF'X)
  4145.     XA(2) = FLOAT(IWRITE_CURSOR(2))/XGUPCM    !X IN CENTIMETERS.
  4146.     XA(3) = FLOAT(MAXY-IWRITE_CURSOR(3))/YGUPCM    !Y IN CM.
  4147. C
  4148. C    MAKE THE CURSOR INVISIBLE
  4149. C
  4150.     CALL GD94WRITE(IWRITE_CURSOR, IWRITE_BYTES)
  4151.     RETURN
  4152. C
  4153. C    **************************
  4154. C    SET COLOR USING RGB VALUES
  4155. C    **************************
  4156. C
  4157. 1000    LOAD_LUT(2) = XA(1)    !DIGLIB COLOR IS LUT ADDRESS
  4158.     LOAD_LUT(3) = 2        !2 BYTES TO SET A SINGLE COLOR
  4159.     LOAD_LUT(4) = 256*INT(0.15*YA(1))
  4160.     1    + 16*INT(0.15*YA(2)) + INT(0.15*YA(3))
  4161.     CALL GD94WRITE(LOAD_LUT,LOAD_LUT_BYTES)
  4162.     RETURN
  4163.     END
  4164.     SUBROUTINE GD9400_MOVE(IX,IY)
  4165. C
  4166. C    **********
  4167.     PARAMETER (IBUFFER_SIZE = 512)
  4168.     INTEGER*2 IBUFFER
  4169.     LOGICAL LMOVED, LCOLOR_CHANGED
  4170.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4171.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4172. C    **********
  4173. C
  4174.     LMOVED = .TRUE.
  4175.     IXPOSN = IX
  4176.     IYPOSN = IY
  4177.     RETURN
  4178.     END
  4179.     SUBROUTINE GD9400_DRAW(IX,IY)
  4180. C
  4181. C    **********
  4182.     PARAMETER (IBUFFER_SIZE = 512)
  4183.     INTEGER*2 IBUFFER
  4184.     LOGICAL LMOVED, LCOLOR_CHANGED
  4185.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4186.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4187. C    **********
  4188. C
  4189.     INTEGER*2 IWVL_AND_OP1, ICOP, ICOP_AND_FOREGROUND
  4190.     PARAMETER (IWVL_AND_OP1 = '0E03'X)
  4191.     PARAMETER (ICOP = '8000'X)
  4192.     PARAMETER (ICOP_AND_FOREGROUND = '8002'X)
  4193.     LOGICAL GD9400_FLUSHIF, LDUMMY
  4194. C
  4195. D    TYPE *,'GD9400_DRAW: IBUFFER_POINTER = ',IBUFFER_POINTER
  4196.     IF (LCOLOR_CHANGED .OR. LMOVED .OR. GD9400_FLUSHIF(2)) THEN
  4197.         LDUMMY = GD9400_FLUSHIF(9)
  4198.         IBUFFER(IBUFFER_POINTER) = IWVL_AND_OP1
  4199.         IBUFFER(IBUFFER_POINTER+1) = ICOP_AND_FOREGROUND
  4200.         IBUFFER(IBUFFER_POINTER+2) = ICURRENT_COLOR
  4201.         IBUFFER(IBUFFER_POINTER+3) = IXPOSN
  4202.         IBUFFER(IBUFFER_POINTER+4) = IYPOSN
  4203.         IBUFFER(IBUFFER_POINTER+5) = 0
  4204.         INDEX_NBYTES = IBUFFER_POINTER + 5
  4205.         IBUFFER_POINTER = IBUFFER_POINTER + 6
  4206.         LCOLOR_CHANGED = .FALSE.
  4207.         LMOVED = .FALSE.
  4208.       ENDIF
  4209.     IBUFFER(IBUFFER_POINTER) = IX
  4210.     IBUFFER(IBUFFER_POINTER+1) = IY
  4211.     IBUFFER_POINTER = IBUFFER_POINTER+2
  4212.     IXPOSN = IX
  4213.     IYPOSN = IY
  4214. C
  4215. C    COUNT BYTES OF DATA
  4216. C
  4217.     IBUFFER(INDEX_NBYTES) = IBUFFER(INDEX_NBYTES) + 4
  4218.     RETURN
  4219.     END
  4220.     SUBROUTINE GD9400_COLOR_SET(ICOLOR)
  4221. C
  4222. C    **********
  4223.     PARAMETER (IBUFFER_SIZE = 512)
  4224.     INTEGER*2 IBUFFER
  4225.     LOGICAL LMOVED, LCOLOR_CHANGED
  4226.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4227.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4228. C    **********
  4229. C
  4230.     IF (ICOLOR .NE. ICURRENT_COLOR) THEN
  4231.         ICURRENT_COLOR = ICOLOR
  4232.         LCOLOR_CHANGED = .TRUE.
  4233.       ENDIF
  4234.     RETURN
  4235.     END
  4236.     FUNCTION GD9400_FLUSHIF(NWORDS)
  4237.     LOGICAL GD9400_FLUSHIF
  4238. C
  4239. C    **********
  4240.     PARAMETER (IBUFFER_SIZE = 512)
  4241.     INTEGER*2 IBUFFER
  4242.     LOGICAL LMOVED, LCOLOR_CHANGED
  4243.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4244.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4245. C    **********
  4246. C
  4247. D    TYPE *,'GD9400_FLUSHIF(',NWORDS,') : IBUFFER_POINTER = ',
  4248.     1   IBUFFER_POINTER
  4249.     IF ((IBUFFER_SIZE+1-IBUFFER_POINTER) .GE. NWORDS) THEN
  4250.         GD9400_FLUSHIF = .FALSE.
  4251.       ELSE
  4252.         CALL GD9400_FLUSH
  4253.         GD9400_FLUSHIF = .TRUE.
  4254.       ENDIF
  4255.     RETURN
  4256.     END
  4257.     SUBROUTINE GD9400_FLUSH
  4258. C
  4259. C    **********
  4260.     PARAMETER (IBUFFER_SIZE = 512)
  4261.     INTEGER*2 IBUFFER
  4262.     LOGICAL LMOVED, LCOLOR_CHANGED
  4263.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4264.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4265. C    **********
  4266. C
  4267.     IF (IBUFFER_POINTER .GT. 1) THEN
  4268.         CALL GD94WRITE(IBUFFER,2*(IBUFFER_POINTER-1))
  4269.         IBUFFER_POINTER = 1
  4270.         LMOVED = .TRUE.
  4271.       ENDIF
  4272.     RETURN
  4273.     END
  4274.     SUBROUTINE GD9400_BUFRINIT
  4275. C
  4276. C    **********
  4277.     PARAMETER (IBUFFER_SIZE = 512)
  4278.     INTEGER*2 IBUFFER
  4279.     LOGICAL LMOVED, LCOLOR_CHANGED
  4280.     COMMON /GD9400_MD/ IBUFFER(IBUFFER_SIZE), ICURRENT_COLOR,
  4281.     1   IXPOSN, IYPOSN, IBUFFER_POINTER, LMOVED, LCOLOR_CHANGED
  4282. C    **********
  4283. C
  4284.     IBUFFER_POINTER = 1
  4285.     LCOLOR_CHANGED = .TRUE.
  4286.     ICURRENT_COLOR = 1
  4287.     IXPOSN = 0
  4288.     IYPOSN = 0
  4289.     RETURN
  4290.     END
  4291.     SUBROUTINE GD94WRITE(BUFFER,NBYTES)
  4292.     INTEGER*2 BUFFER(NBYTES/2)
  4293. C
  4294. C    THIS SUBROUTINE WRITES A BUFFER TO THE RAMTEK.
  4295. C
  4296. C    **********
  4297.     INTEGER*2 IOCHAN
  4298.     COMMON /GD9400_IO/ IOCHAN
  4299. C    **********
  4300. C
  4301.     PARAMETER (IOWRITE = '00000020'X)
  4302.     INTEGER*2 IOSB(4)
  4303.     INTEGER*4 SYS$QIOW
  4304. D    TYPE 9999, NBYTES, (BUFFER(I), BUFFER(I), I=1,NBYTES/2)
  4305. D9999    FORMAT(' GD9400 WRITE'/' BYTE COUNT IS ',I6/
  4306. D    1   128(1X,Z4,'H',4X,O6/))
  4307.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IOWRITE),
  4308.     1   IOSB, , ,BUFFER,%VAL(NBYTES), , , , )
  4309. D    TYPE *,'GD9400 WRITE STATUS IS ',ISTAT
  4310.     IF (.NOT. ISTAT) STOP 'GD9400 - WRITE ERROR'
  4311.     RETURN
  4312.     END
  4313.     SUBROUTINE GDAID(X,Y,XGUPCM,YGUPCM,IX,IY)
  4314. C
  4315.     IX = XGUPCM*X + 0.5
  4316.     IY = YGUPCM*Y + 0.5
  4317.     RETURN
  4318.     END
  4319.     SUBROUTINE GDGAID(IX,IY,XGUPCM,YGUPCM,X,Y)
  4320. C
  4321.     X = FLOAT(IX)/XGUPCM
  4322.     Y = FLOAT(IY)/YGUPCM
  4323.     RETURN
  4324.     END
  4325.     SUBROUTINE GDDM800(IFXN,XA,YA)
  4326.     DIMENSION XA(8), YA(3)
  4327. C
  4328. C    DATA MEDIA WITH DM800 RETRO-GRAPHICS UPGRADE
  4329. C     This driver assumes the terminal is normally in the VT100 mode
  4330. C     of operation.   Thus, on device initialization, the DM800 is set
  4331. C     to 4027 emulation from VT100 emulation.   On device release, the
  4332. C     DM800 is returned to VT100 emulation.
  4333. C
  4334. C-----------------------------------------------------------------------
  4335. C
  4336. C    DEFINE DATA MEDIA 4027 EMULATION COMMAND CHARACTER
  4337. C
  4338.     BYTE CMD
  4339.     PARAMETER (CMD=33)
  4340. C
  4341.     BYTE CSUB, US, GS, CR, FF
  4342.     PARAMETER (ESC=27, CSUB=26, US=31, GS=29, CR=13, FF=12)
  4343.     CHARACTER*(*) TERMINAL
  4344.     PARAMETER (TERMINAL='TT')
  4345. C
  4346. C    DEFINITIONS FOR DEVICE CONTROL
  4347. C
  4348.     BYTE STR_END(2), STR_BEGIN_PLOT(14), STR_COLOR_SET(8)
  4349.     BYTE STR_INIT_DM800(49), STR_RELEASE(6)
  4350.     BYTE COLOR_MAP(8)
  4351. C
  4352.     DATA STR_END /13,0/
  4353.     DATA STR_INIT_DM800 /
  4354.     1   GS, ESC, '"', '6', 'g',
  4355.     2   CMD,'W','O','R',' ','3','0',
  4356.     3   CMD,'G','R','A',' ','1',',','3','0',
  4357.     4   CMD,'J','U','M',' ','1',',','1',
  4358.     5   CMD,'L','I','N',' ','1',
  4359.     6   CMD,'S','H','R',' ','N',
  4360.     7   CMD,'C','O','L',' ','0',2*0/
  4361.     DATA STR_BEGIN_PLOT /
  4362.     1   CMD,'E','R','A',' ','G',
  4363.     2   CMD,'C','O','L',' ','C','0',0/
  4364.     DATA STR_COLOR_SET /
  4365.     1   CMD,'C','O','L',' ','C','0',0/
  4366.     DATA STR_RELEASE /
  4367.     1   ESC,'"','0','g',2*0/
  4368.     DATA COLOR_MAP / 0, 1, 2, 3, 4, 5, 6, 7 /
  4369. C
  4370. C    DEFINITIONS FOR GIN
  4371. C
  4372.     BYTE GINBUFR(28), PROMPT(8)
  4373. C
  4374.     DATA PROMPT /
  4375.     1   CMD,'E','N','A',' ','1',CR,0/
  4376.     DATA IGIN_IN_CHARS /27/
  4377. C
  4378. C    DECLARE BUFFERING FUNCTION
  4379. C
  4380.     LOGICAL GB_TEST_FLUSH
  4381. C
  4382. C    DECLARE VARS NEED FOR DRIVER OPERATION
  4383. C
  4384.     LOGICAL LVECTOR_GOING, LDUMMY
  4385.     DIMENSION DCHAR(8)
  4386. C
  4387. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  4388. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  4389. C
  4390.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  4391.     DATA DCHAR /800.0, 21.69, 14.223, 29.46, 29.46, 7.0, 229.0, 1.0/
  4392. C
  4393. C*****************
  4394. C
  4395. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  4396. C
  4397.     IF (IFXN .LE. 0 .OR. IFXN .GT. 11) RETURN
  4398. C
  4399. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  4400. C
  4401.     GO TO (100,200,300,400,500,600,700,800,900,1000,1100) IFXN
  4402. C
  4403. C    *********************
  4404. C    INITIALIZE THE DEVICE
  4405. C    *********************
  4406. C
  4407. 100    CONTINUE
  4408. C
  4409. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  4410. C
  4411.     CALL GB_INITIALIZE(US,STR_END,TERMINAL,IERR)
  4412.     YA(1) = IERR
  4413.     IF (IERR .NE. 0) RETURN
  4414.     CALL GB_IN_STRING(STR_INIT_DM800)
  4415. 190    CONTINUE
  4416.     CALL GD4027_MAP(CC,0,0,100,100)
  4417.     CALL GD4027_MAP(CC,1,120,50,100)
  4418.     CALL GD4027_MAP(CC,2,240,50,100)
  4419.     CALL GD4027_MAP(CC,3,0,50,100)
  4420.     CALL GD4027_MAP(CC,4,180,50,100)
  4421.     CALL GD4027_MAP(CC,5,60,50,100)
  4422.     CALL GD4027_MAP(CC,6,300,50,100)
  4423.     CALL GD4027_MAP(CC,7,0,0,0)
  4424.     CALL GB_EMPTY
  4425.     LVECTOR_GOING = .FALSE.
  4426.     RETURN
  4427. C
  4428. C    **************************
  4429. C    GET FRESH PLOTTING SURFACE
  4430. C    **************************
  4431. C
  4432. 200    CONTINUE
  4433.     CALL GB_NEW_BUFFER
  4434.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  4435.     GO TO 190
  4436. C
  4437. C    ****
  4438. C    MOVE
  4439. C    ****
  4440. C
  4441. 300    CONTINUE
  4442. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  4443.     IXPOSN = XGUPCM*XA(1)+0.5
  4444.     IYPOSN = YGUPCM*YA(1)+0.5
  4445.     LVECTOR_GOING = .FALSE.
  4446.     RETURN
  4447. C
  4448. C    ****
  4449. C    DRAW
  4450. C    ****
  4451. C
  4452. 400    CONTINUE
  4453.     IX = XGUPCM*XA(1)+0.5
  4454.     IY = YGUPCM*YA(1)+0.5
  4455.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  4456.     IF (LVECTOR_GOING) GO TO 410
  4457.     LDUMMY = GB_TEST_FLUSH(9)
  4458.     LVECTOR_GOING =  .TRUE.
  4459.     CALL GB_INSERT(GS)
  4460.     CALL GB_USE_TERMINATOR
  4461.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  4462. 410    CALL GD_4010_CONVERT(IX,IY)
  4463.     IXPOSN = IX
  4464.     IYPOSN = IY
  4465.     RETURN
  4466. C
  4467. C    *****************************
  4468. C    FLUSH GRAPHICS COMMAND BUFFER
  4469. C    *****************************
  4470. C
  4471. 500    CONTINUE
  4472.     CALL GB_EMPTY
  4473.     LVECTOR_GOING = .FALSE.
  4474.     RETURN
  4475. C
  4476. C    ******************
  4477. C    RELEASE THE DEVICE
  4478. C    ******************
  4479. C
  4480. 600    CONTINUE
  4481. C
  4482. C    RETURN TO VT100 MODE
  4483. C
  4484.     CALL GB_EMPTY
  4485.     CALL GB_IN_STRING(STR_RELEASE)
  4486.     CALL GB_EMPTY
  4487.     RETURN
  4488. C
  4489. C    *****************************
  4490. C    RETURN DEVICE CHARACTERISTICS
  4491. C    *****************************
  4492. C
  4493. 700    CONTINUE
  4494.     DO 720 I=1,8
  4495.     XA(I) = DCHAR(I)
  4496. 720    CONTINUE
  4497.     RETURN
  4498. C
  4499. C    ****************************
  4500. C    SELECT CURRENT DRAWING COLOR
  4501. C    ****************************
  4502. C
  4503. 800    CONTINUE
  4504.     CALL GB_EMPTY
  4505.     ICOLOR = XA(1)
  4506.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 7) RETURN
  4507.     STR_COLOR_SET(7) = 48 + COLOR_MAP(ICOLOR)
  4508.     CALL GB_IN_STRING(STR_COLOR_SET)
  4509.     LVECTOR_GOING = .FALSE.
  4510.     RETURN
  4511. C
  4512. C    **********************
  4513. C    PERFORM GRAPHICS INPUT
  4514. C    **********************
  4515. C
  4516. 900    CONTINUE
  4517.     CALL GB_EMPTY
  4518.     LVECTOR_GOING = .FALSE.
  4519. C
  4520. C    ASK FOR 1 GIN INPUT
  4521. C
  4522. C
  4523.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.FALSE.,GINBUFR)
  4524. C
  4525. C    GET KEY PRESSED, X AND Y
  4526. C
  4527. C    KEY IS AT 9, X IS AT 13, AND Y IS AT 17
  4528. C
  4529.     DECODE (11,911,GINBUFR(9)) XA(1), XA(2), XA(3)
  4530. 911    FORMAT(F3.0,1X,F3.0,1X,F3.0)
  4531.     XA(2) = XA(2)/XGUPCM
  4532.     XA(3) = XA(3)/YGUPCM
  4533.     RETURN
  4534. C
  4535. C    *******************
  4536. C    SET COLOR USING RGB
  4537. C    *******************
  4538. C
  4539. 1000    CONTINUE
  4540.     ICOLOR = COLOR_MAP(INT(XA(1)))
  4541.     CALL GD4027_MIX(CC,ICOLOR,INT(YA(1)+0.5),INT(YA(2)+0.5),INT(YA(3)+0.5))
  4542.     RETURN
  4543. C
  4544. C    *******************
  4545. C    SET COLOR USING HLS
  4546. C    *******************
  4547. C
  4548. 1100    CONTINUE
  4549.     ICOLOR = COLOR_MAP(INT(XA(1)))
  4550.     CALL GD4027_MAP(CC,ICOLOR,INT(YA(1)+0.5),INT(YA(2)+0.5),INT(YA(3)+0.5))
  4551.     RETURN
  4552.     END
  4553.     SUBROUTINE GDDQ650(IFXN,XA,YA)
  4554.     DIMENSION XA(8), YA(3)
  4555. C
  4556. C    VT100 WITH DQ650 RETRO-GRAPHICS UPGRADE
  4557. C     This driver assumes the terminal is normally in the VT100 mode
  4558. C     of operation.   Thus, on device initialization, the DQ650 is set
  4559. C     to 4027 emulation from VT100 emulation.   On device release, the
  4560. C     DQ650 is returned to VT100 emulation.
  4561. C
  4562. C-----------------------------------------------------------------------
  4563. C
  4564.     BYTE CMD, CSUB, US, GS, CR, FF
  4565.     PARAMETER (esc=27, CMD=33, CSUB=26, US=31, GS=29, CR=13, FF=12)
  4566.     CHARACTER*(*) TERMINAL
  4567.     PARAMETER (TERMINAL='TT')
  4568. C
  4569. C    DEFINITIONS FOR DEVICE CONTROL
  4570. C
  4571.     BYTE STR_END(2), STR_BEGIN_PLOT(14), STR_COLOR_SET(8)
  4572.     BYTE STR_INIT_DQ650(49), STR_RELEASE(6)
  4573. C
  4574.     DATA STR_END /13,0/
  4575.     DATA STR_INIT_DQ650 /
  4576.     1   GS, ESC, '"', '6', 'g',
  4577.     2   CMD,'W','O','R',' ','3','0',
  4578.     3   CMD,'G','R','A',' ','1',',','3','0',
  4579.     4   CMD,'J','U','M',' ','1',',','1',
  4580.     5   CMD,'L','I','N',' ','1',
  4581.     6   CMD,'S','H','R',' ','N',
  4582.     7   CMD,'C','O','L',' ','0',2*0/
  4583.     DATA STR_BEGIN_PLOT /
  4584.     1   CMD,'E','R','A',' ','G',
  4585.     2   CMD,'C','O','L',' ','C','0',0/
  4586.     DATA STR_COLOR_SET /
  4587.     1   CMD,'C','O','L',' ','C','0',0/
  4588.     DATA STR_RELEASE /
  4589.     1   ESC,'"','0','g',2*0/
  4590. C
  4591. C    DEFINITIONS FOR GIN
  4592. C
  4593.     BYTE GINBUFR(28), PROMPT(8)
  4594. C
  4595.     DATA PROMPT /
  4596.     1   CMD,'E','N','A',' ','1',CR,0/
  4597.     DATA IGIN_IN_CHARS /27/
  4598. C
  4599. C    DECLARE BUFFERING FUNCTION
  4600. C
  4601.     LOGICAL GB_TEST_FLUSH
  4602. C
  4603. C    DECLARE VARS NEED FOR DRIVER OPERATION
  4604. C
  4605.     LOGICAL LVECTOR_GOING, LDUMMY
  4606.     DIMENSION DCHAR(8)
  4607. C
  4608. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  4609. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  4610. C
  4611.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  4612.     DATA DCHAR /650.0, 21.69, 14.223, 29.46, 29.46, 1.0, 133.0, 1.0/
  4613. C
  4614. C*****************
  4615. C
  4616. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  4617. C
  4618.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  4619. C
  4620. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  4621. C
  4622.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  4623. C
  4624. C    *********************
  4625. C    INITIALIZE THE DEVICE
  4626. C    *********************
  4627. C
  4628. 100    CONTINUE
  4629. C
  4630. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  4631. C
  4632.     CALL GB_INITIALIZE(US,STR_END,TERMINAL,IERR)
  4633.     YA(1) = IERR
  4634.     IF (IERR .NE. 0) RETURN
  4635.     CALL GB_IN_STRING(STR_INIT_DQ650)
  4636.     CALL GD4027_MAP(CC,0,0,100,100)
  4637.     CALL GD4027_MAP(CC,7,0,0,0)
  4638. 190    CONTINUE
  4639.     CALL GB_EMPTY
  4640.     LVECTOR_GOING = .FALSE.
  4641.     RETURN
  4642. C
  4643. C    **************************
  4644. C    GET FRESH PLOTTING SURFACE
  4645. C    **************************
  4646. C
  4647. 200    CONTINUE
  4648.     CALL GB_NEW_BUFFER
  4649.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  4650.     GO TO 190
  4651. C
  4652. C    ****
  4653. C    MOVE
  4654. C    ****
  4655. C
  4656. 300    CONTINUE
  4657. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  4658.     IXPOSN = XGUPCM*XA(1)+0.5
  4659.     IYPOSN = YGUPCM*YA(1)+0.5
  4660.     LVECTOR_GOING = .FALSE.
  4661.     RETURN
  4662. C
  4663. C    ****
  4664. C    DRAW
  4665. C    ****
  4666. C
  4667. 400    CONTINUE
  4668.     IX = XGUPCM*XA(1)+0.5
  4669.     IY = YGUPCM*YA(1)+0.5
  4670.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  4671.     IF (LVECTOR_GOING) GO TO 410
  4672.     LDUMMY = GB_TEST_FLUSH(9)
  4673.     LVECTOR_GOING =  .TRUE.
  4674.     CALL GB_INSERT(GS)
  4675.     CALL GB_USE_TERMINATOR
  4676.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  4677. 410    CALL GD_4010_CONVERT(IX,IY)
  4678.     IXPOSN = IX
  4679.     IYPOSN = IY
  4680.     RETURN
  4681. C
  4682. C    *****************************
  4683. C    FLUSH GRAPHICS COMMAND BUFFER
  4684. C    *****************************
  4685. C
  4686. 500    CONTINUE
  4687.     CALL GB_EMPTY
  4688.     LVECTOR_GOING = .FALSE.
  4689.     RETURN
  4690. C
  4691. C    ******************
  4692. C    RELEASE THE DEVICE
  4693. C    ******************
  4694. C
  4695. 600    CONTINUE
  4696. C
  4697. C    RETURN TO VT100 MODE
  4698. C
  4699.     CALL GB_EMPTY
  4700.     CALL GB_IN_STRING(STR_RELEASE)
  4701.     CALL GB_EMPTY
  4702.     RETURN
  4703. C
  4704. C    *****************************
  4705. C    RETURN DEVICE CHARACTERISTICS
  4706. C    *****************************
  4707. C
  4708. 700    CONTINUE
  4709.     DO 720 I=1,8
  4710.     XA(I) = DCHAR(I)
  4711. 720    CONTINUE
  4712.     RETURN
  4713. C
  4714. C    ****************************
  4715. C    SELECT CURRENT DRAWING COLOR
  4716. C    ****************************
  4717. C
  4718. 800    CONTINUE
  4719.     CALL GB_EMPTY
  4720.     ICOLOR = XA(1)
  4721.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  4722.     IF (ICOLOR .EQ. 0) THEN
  4723.         STR_COLOR_SET(7) = 48+7
  4724.         ELSE
  4725.         STR_COLOR_SET(7) = 48
  4726.     ENDIF
  4727.     CALL GB_IN_STRING(STR_COLOR_SET)
  4728.     LVECTOR_GOING = .FALSE.
  4729.     RETURN
  4730. C
  4731. C    **********************
  4732. C    PERFORM GRAPHICS INPUT
  4733. C    **********************
  4734. C
  4735. 900    CONTINUE
  4736.     CALL GB_EMPTY
  4737.     LVECTOR_GOING = .FALSE.
  4738. C
  4739. C    ASK FOR 1 GIN INPUT
  4740. C
  4741. C
  4742.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.FALSE.,GINBUFR)
  4743. C
  4744. C    GET KEY PRESSED, X AND Y
  4745. C
  4746. C    KEY IS AT 9, X IS AT 13, AND Y IS AT 17
  4747. C
  4748.     DECODE (11,911,GINBUFR(9)) XA(1), XA(2), XA(3)
  4749. 911    FORMAT(F3.0,1X,F3.0,1X,F3.0)
  4750.     XA(2) = XA(2)/XGUPCM
  4751.     XA(3) = XA(3)/YGUPCM
  4752.     RETURN
  4753.     END
  4754.     SUBROUTINE GDGX1000(IFXN,XA,YA)
  4755.     DIMENSION XA(8), YA(3)
  4756. C
  4757. C    MODGRAPH GX-1000 DRIVER FOR DIGLIB/VAX
  4758. C
  4759. C-----------------------------------------------------------------------
  4760. C
  4761.     EXTERNAL LEN
  4762.     BYTE ESC, CSUB, TMODE, GS, CR, FF
  4763.     PARAMETER (ESC=27, CSUB=26, TMODE=24, GS=29, CR=13, FF=12)
  4764.     CHARACTER*(*) TERMINAL
  4765.     PARAMETER (TERMINAL='TT')
  4766. C
  4767. C    DEFINITIONS FOR DEVICE CONTROL
  4768. C
  4769.     BYTE STR_BEGIN_PLOT(10), STR_COLOR_SET(6), STR_INIT_DEV(22)
  4770.     DATA STR_INIT_DEV /ESC,'^','2','2','4','f',    !STATUS LINE OFF
  4771.     1   ESC,'^','1','9',';','0','s',        !TEXT OVER GRAPHICS
  4772.     2   ESC,'^','4','2',';','1','s',0,0/        !MANUAL SCREEN CONTROL
  4773.     DATA STR_BEGIN_PLOT /GS,ESC,FF,
  4774.     1   ESC,'/','0','d',ESC,'`',0/
  4775.     DATA STR_COLOR_SET /GS,ESC,'/','0','d',0/
  4776. C
  4777. C    DEFINITIONS FOR GIN
  4778. C
  4779.     BYTE GINBUFR(8), PROMPT(4)
  4780.     DATA PROMPT /GS, ESC, CSUB, 0/
  4781.     DATA IGIN_IN_CHARS /6/        !5 FROM 4010 GIN, PLUS CR
  4782. C
  4783. C    DECLARE BUFFERING FUNCTION
  4784. C
  4785.     LOGICAL GB_TEST_FLUSH
  4786. C
  4787. C    DECLARE VARS NEED FOR DRIVER OPERATION
  4788. C
  4789.     LOGICAL LVECTOR_GOING, LDUMMY
  4790.     DIMENSION DCHAR(8)
  4791. C
  4792. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  4793. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  4794. C
  4795.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  4796.     DATA DCHAR /1000.0, 25.5, 19.417, 40.12, 40.12, 1.0, 133.0, 1.0/
  4797. C
  4798. C*****************
  4799. C
  4800. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  4801. C
  4802.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  4803. C
  4804. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  4805. C
  4806.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  4807. C
  4808. C    *********************
  4809. C    INITIALIZE THE DEVICE
  4810. C    *********************
  4811. C
  4812. 100    CONTINUE
  4813. C
  4814. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  4815. C
  4816.     CALL GB_INITIALIZE(TMODE,0,TERMINAL,IERR)
  4817.     YA(1) = IERR
  4818.     LVECTOR_GOING = .FALSE.
  4819.     CALL GB_NEW_BUFFER
  4820.     CALL GB_IN_STRING(STR_INIT_DEV)
  4821.     CALL GB_EMPTY
  4822.     RETURN
  4823. C
  4824. C    **************************
  4825. C    GET FRESH PLOTTING SURFACE
  4826. C    **************************
  4827. C
  4828. 200    CONTINUE
  4829.     CALL GB_EMPTY
  4830.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  4831.     CALL GB_USE_TERMINATOR
  4832.     LVECTOR_GOING = .FALSE.
  4833.     RETURN
  4834. C
  4835. C    ****
  4836. C    MOVE
  4837. C    ****
  4838. C
  4839. 300    CONTINUE
  4840. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  4841.     IXPOSN = XGUPCM*XA(1)+0.5
  4842.     IYPOSN = YGUPCM*YA(1)+0.5
  4843.     LVECTOR_GOING = .FALSE.
  4844.     RETURN
  4845. C
  4846. C    ****
  4847. C    DRAW
  4848. C    ****
  4849. C
  4850. 400    CONTINUE
  4851.     IX = XGUPCM*XA(1)+0.5
  4852.     IY = YGUPCM*YA(1)+0.5
  4853.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  4854.     IF (LVECTOR_GOING) GO TO 410
  4855.     LDUMMY = GB_TEST_FLUSH(9)
  4856.     LVECTOR_GOING = .TRUE.
  4857.     CALL GB_INSERT(GS)
  4858.     CALL GB_USE_TERMINATOR
  4859.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  4860. 410    CALL GD_4010_CONVERT(IX,IY)
  4861.     IXPOSN = IX
  4862.     IYPOSN = IY
  4863.     RETURN
  4864. C
  4865. C    *****************************
  4866. C    FLUSH GRAPHICS COMMAND BUFFER
  4867. C    *****************************
  4868. C
  4869. 500    CONTINUE
  4870.     CALL GB_EMPTY
  4871.     LVECTOR_GOING = .FALSE.
  4872.     RETURN
  4873. C
  4874. C    ******************
  4875. C    RELEASE THE DEVICE
  4876. C    ******************
  4877. C
  4878. 600    CONTINUE
  4879. C
  4880. C    DE-ASSIGN THE CHANNAL
  4881. C
  4882.     CALL GB_FINISH(0)
  4883.     RETURN
  4884. C
  4885. C    *****************************
  4886. C    RETURN DEVICE CHARACTERISTICS
  4887. C    *****************************
  4888. C
  4889. 700    CONTINUE
  4890.     DO 720 I=1,8
  4891.     XA(I) = DCHAR(I)
  4892. 720    CONTINUE
  4893.     RETURN
  4894. C
  4895. C    ****************************
  4896. C    SELECT CURRENT DRAWING COLOR
  4897. C    ****************************
  4898. C
  4899. 800    CONTINUE
  4900.     LDUMMY = GB_TEST_FLUSH(8)
  4901.     ICOLOR = XA(1)
  4902.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  4903.     ICOLOR = 1-ICOLOR        !CONVERT 1 TO 0 AND 0 INTO 1
  4904.     STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER 0 OR 1
  4905.     CALL GB_IN_STRING(STR_COLOR_SET)
  4906.     CALL GB_USE_TERMINATOR
  4907.     LVECTOR_GOING = .FALSE.
  4908.     RETURN
  4909. C
  4910. C    **********************
  4911. C    PERFORM GRAPHICS INPUT
  4912. C    **********************
  4913. C
  4914. 900    CONTINUE
  4915.     CALL GB_EMPTY
  4916.     LVECTOR_GOING = .FALSE.
  4917. C
  4918.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  4919. C
  4920.     ICHAR = GINBUFR(1)
  4921.     IX1 = GINBUFR(2)
  4922.     IX2 = GINBUFR(3)
  4923.     IY1 = GINBUFR(4)
  4924.     IY2 = GINBUFR(5)
  4925. C
  4926.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  4927.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  4928.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  4929. C
  4930.     CALL GB_SEND_CHARS(TMODE,1)
  4931.     RETURN
  4932.     END
  4933.     SUBROUTINE GDHIREZ(IFXN,XA,YA)
  4934.     DIMENSION XA(8), YA(3)
  4935. CC
  4936. C    SELANAR HIREZ 100 (1024x768) DRIVER FOR DIGLIB/VAX
  4937. C       This driver almost works, but doesn't.   It is distributed only
  4938. C     as a time saver for those who have this device.   I (Hal) no longer
  4939. C     have access to this terminal, so I can not debug this driver.
  4940. C     Please call me about it ONLY AS A VERY LAST RESORT!!!!!
  4941. C
  4942. C-----------------------------------------------------------------------
  4943. C
  4944.     EXTERNAL LEN
  4945.     BYTE ESC, CSUB, TMODE, GS, CR, FF
  4946.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12)
  4947.     CHARACTER*(*) TERMINAL
  4948.     PARAMETER (TERMINAL='TT')
  4949. C
  4950. C    DEFINITIONS FOR DEVICE CONTROL
  4951. C
  4952.     BYTE STR_BEGIN_PLOT(18), STR_COLOR_SET(6), STR_INIT_DEV(54)
  4953.     BYTE STR_END_PLOT(2), STR_ANSI(4)
  4954.     DATA STR_INIT_DEV /GS,ESC,'\',ESC,'O','D',32,96,32,64,64,
  4955.     1   ESC,'O','V',32,96,32,64,55,127,63,95,
  4956.     2   ESC,'O','O',32,96,32,64,64,
  4957.     3   ESC,'O','X',32,97,32,68,32,96,32,64,
  4958.     4   ESC,'O','Y',32,97,32,68,32,96,32,64,2*0/
  4959.     DATA STR_BEGIN_PLOT /ESC,'[','H',ESC,'[','J',GS,ESC,FF,
  4960.     1   ESC,'O','W',32,96,32,64,64,0/
  4961.     DATA STR_COLOR_SET /GS,ESC,'O','W',2*0/
  4962.     DATA STR_END_PLOT /0,0/
  4963.     DATA STR_ANSI /ESC,'2',2*0/
  4964. C
  4965. C    DEFINITIONS FOR GIN
  4966. C
  4967.     BYTE GINBUFR(8), PROMPT(4)
  4968.     DATA PROMPT /GS, ESC, CSUB, 0/
  4969.     DATA IGIN_IN_CHARS /6/        !5 FROM 4010 GIN, PLUS CR
  4970. C
  4971. C    DECLARE BUFFERING FUNCTION
  4972. C
  4973.     LOGICAL GB_TEST_FLUSH
  4974. C
  4975. C    DECLARE VARS NEED FOR DRIVER OPERATION
  4976. C
  4977.     LOGICAL LVECTOR_GOING, LDUMMY
  4978.     DIMENSION DCHAR(8)
  4979. C
  4980. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  4981. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  4982. C
  4983.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  4984.     DATA DCHAR /100.0, 20.46, 15.34, 50.0, 50.0, 1.0, 133.0, 1.0/
  4985. C
  4986. C*****************
  4987. C
  4988. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  4989. C
  4990.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  4991. C
  4992. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  4993. C
  4994.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  4995. C
  4996. C    *********************
  4997. C    INITIALIZE THE DEVICE
  4998. C    *********************
  4999. C
  5000. 100    CONTINUE
  5001. C
  5002. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  5003. C
  5004.     CALL GB_INITIALIZE(CR,STR_ANSI,TERMINAL,IERR)
  5005.     YA(1) = IERR
  5006.     CALL GB_IN_STRING(STR_INIT_DEV)
  5007.     CALL GB_EMPTY
  5008.     LVECTOR_GOING = .FALSE.
  5009.     RETURN
  5010. C
  5011. C    **************************
  5012. C    GET FRESH PLOTTING SURFACE
  5013. C    **************************
  5014. C
  5015. 200    CONTINUE
  5016.     CALL GB_EMPTY
  5017.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  5018.     CALL GD_4010_CAN
  5019.     LVECTOR_GOING = .FALSE.
  5020.     RETURN
  5021. C
  5022. C    ****
  5023. C    MOVE
  5024. C    ****
  5025. C
  5026. 300    CONTINUE
  5027. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  5028.     IXPOSN = XGUPCM*XA(1)+0.5
  5029.     IYPOSN = YGUPCM*YA(1)+0.5
  5030.     LVECTOR_GOING = .FALSE.
  5031.     RETURN
  5032. C
  5033. C    ****
  5034. C    DRAW
  5035. C    ****
  5036. C
  5037. 400    CONTINUE
  5038.     IX = XGUPCM*XA(1)+0.5
  5039.     IY = YGUPCM*YA(1)+0.5
  5040.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  5041.     IF (.NOT. LVECTOR_GOING) THEN
  5042.         LDUMMY = GB_TEST_FLUSH(9)
  5043.         LVECTOR_GOING = .TRUE.
  5044.         CALL GB_INSERT(GS)
  5045.         CALL GB_USE_TERMINATOR
  5046.         CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  5047.     ENDIF
  5048.     CALL GD_4010_CONVERT(IX,IY)
  5049.     IXPOSN = IX
  5050.     IYPOSN = IY
  5051.     RETURN
  5052. C
  5053. C    *****************************
  5054. C    FLUSH GRAPHICS COMMAND BUFFER
  5055. C    *****************************
  5056. C
  5057. 500    CONTINUE
  5058.     CALL GB_EMPTY
  5059.     LVECTOR_GOING = .FALSE.
  5060.     RETURN
  5061. C
  5062. C    ******************
  5063. C    RELEASE THE DEVICE
  5064. C    ******************
  5065. C
  5066. 600    CONTINUE
  5067. C
  5068. C    DE-ASSIGN THE CHANNAL
  5069. C
  5070.     CALL GB_FINISH(0)
  5071.     RETURN
  5072. C
  5073. C    *****************************
  5074. C    RETURN DEVICE CHARACTERISTICS
  5075. C    *****************************
  5076. C
  5077. 700    CONTINUE
  5078.     DO 720 I=1,8
  5079.     XA(I) = DCHAR(I)
  5080. 720    CONTINUE
  5081.     RETURN
  5082. C
  5083. C    ****************************
  5084. C    SELECT CURRENT DRAWING COLOR
  5085. C    ****************************
  5086. C
  5087. 800    CONTINUE
  5088.     LDUMMY = GB_TEST_FLUSH(8)
  5089.     ICOLOR = XA(1)
  5090.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  5091.     IF (ICOLOR .EQ. 0) ICOLOR = 2
  5092.     CALL GB_IN_STRING(STR_COLOR_SET)
  5093.     CALL GD_4010_CONVERT(ICOLOR,0)
  5094.     CALL GD_4010_CONVERT(0,0)
  5095.     LVECTOR_GOING = .FALSE.
  5096.     RETURN
  5097. C
  5098. C    **********************
  5099. C    PERFORM GRAPHICS INPUT
  5100. C    **********************
  5101. C
  5102. 900    CONTINUE
  5103.     CALL GB_EMPTY
  5104.     LVECTOR_GOING = .FALSE.
  5105. C
  5106.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  5107. C
  5108.     ICHAR = GINBUFR(1)
  5109.     IX1 = GINBUFR(2)
  5110.     IX2 = GINBUFR(3)
  5111.     IY1 = GINBUFR(4)
  5112.     IY2 = GINBUFR(5)
  5113. C
  5114.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  5115.     XA(2) = (32*IAND(IX1,31)+IAND(IX2,31))/XGUPCM
  5116.     XA(3) = (32*IAND(IY1,31)+IAND(IY2,31))/YGUPCM
  5117. C
  5118.     CALL GB_IN_STRING(STR_ANSI)
  5119.     CALL GB_EMPTY
  5120.     RETURN
  5121.     END
  5122.     SUBROUTINE GDHPGLCONVERT(IX,IY)
  5123. C
  5124. C    THIS SUBROUTINE CONVERTS THE (X,Y) PAIR INTO THE PROPER HPGL
  5125. C    STRING, AND PLACES IT INTO THE BUFFER.   IT IS ASSUMED THAT
  5126. C    THERE IS ROOM FOR THE WHOLE THING IN THE BUFFER.
  5127. C
  5128.     BYTE STRING(12)
  5129.     EXTERNAL LEN
  5130. C
  5131.     CALL NUMSTR(IX,STRING)
  5132.     IEND = LEN(STRING)
  5133.     STRING(IEND+1) = ','
  5134.     CALL NUMSTR(IY,STRING(IEND+2))
  5135.     CALL GB_IN_STRING(STRING)
  5136.     RETURN
  5137.     END
  5138. C This subroutine has an alternate entry point given by the ENTRY statement.
  5139. C  You MUST remember to change that name also when configuring for a
  5140. C  different HPGL plotter!!!!!!!
  5141.  
  5142.     SUBROUTINE GD7475_LONG(IFXN,XA,YA)
  5143.     DIMENSION XA(8), YA(3)
  5144. C
  5145. C    GENERIC HP PLOTTER (WITH RS-232C INTERFACE) DRIVER FOR DIGLIB/VAX
  5146. C    THIS DRIVER SHOULD HANDLE ALL HPGL SPEAKING PLOTTERS WHEN PROPERLY
  5147. C    CONFIGURED.   IT CAN BE USED ON A DEDICATED LINE, OR IN-LINE.
  5148. C     This driver has not be tested since it was modified to work in-line.
  5149. C     However, I have a lot of faith in it, but you all know that a
  5150. C     programmers faith and a buck won't even buy a cup of coffee.
  5151. C
  5152. C    ### THIS DRIVER REQUIRES DIGLIB V3.1H OR LATER ###
  5153. C
  5154. C************************************************************************
  5155. C                                    *
  5156. C    PLOTTER CONFIGURATION PARAMETERS                *
  5157. C                                    *
  5158.     PARAMETER (PLOTTER_ID = 7475.0)    !PLOTTER DESIGNATION        *
  5159.     PARAMETER (X_WIDTH_CM = 25.0)    !PAPER WIDTH IN CM.        *
  5160.     PARAMETER (Y_HEIGHT_CM = 18.0)    !PAPER HEIGHT IN CM.        *
  5161.     PARAMETER (X_RESOLUTION = 400.0)!X GRAPHICS UNITS PER CM.    *
  5162.     PARAMETER (Y_RESOLUTION = 400.0)!Y GRAPHICS UNITS PER CM.    *
  5163.     PARAMETER (NUMBER_FOREGROUND_COLORS = 6.0) !NUMBER OF PENS    *
  5164.     PARAMETER (PEN_WIDTH_IN_PLOTTER_UNITS = 15.0) !            *
  5165.     LOGICAL AUTO_PAGE_PLOTTER    !                *
  5166.     PARAMETER (AUTO_PAGE_PLOTTER = .FALSE.) !NO PAPER ADVANCE    *
  5167.     CHARACTER*(*) TERMINAL        !                *
  5168. C                                    *
  5169. C    ### CONFIGURED FOR DEDICATED RS232 LINE USE ###            *
  5170. C        TO CONFIGURE FOR IN-LINE USE, COMMENT OUT NEXT LINE    *
  5171. C        AND UNCOMMENT OUT LINE AFTER THAT.            *
  5172. C                                    *
  5173.     PARAMETER (TERMINAL='HP7475$TERM') !LOGICAL NAME OF RS-232 LINE    *
  5174. C    PARAMETER (TERMINAL='TT:')    !LOGICAL NAME FOR IN-LINE USE    *
  5175. C                                    *
  5176. C************************************************************************
  5177. C
  5178.     BYTE ESC, BCOMMA, BSEMICOLON
  5179.     PARAMETER (ESC=27, BCOMMA=',', BSEMICOLON=';')
  5180.  
  5181. C
  5182. C    DEVICE CONTROL DEFINITIONS
  5183. C
  5184.     BYTE STR_INIT_DEVICE(30), STR_BEGIN_PLOT(6)
  5185.     BYTE STR_COLOR_SET(6)
  5186.     BYTE STR_PUT_PEN_AWAY(8), STR_PLOTTER_OFF(4), STR_PLOTTER_ON(4)
  5187.     BYTE STR_PEN_UP(4), STR_PEN_DOWN(4)
  5188.     DATA STR_INIT_DEVICE /
  5189.     1   ESC,'.','@',';','0',':',    !NO HARDWIRED HANDSHAKE
  5190.     2   ESC,'.','I','8','1',';',';','1','7',':', !XON/XOFF HANDSHAKE
  5191.     3   ESC,'.','N',';','1','9',':', !XON/XOFF HANDSHAKE
  5192.     4   'D','F',';',        !SET PLOTTER DEFAULT VALUES
  5193.     5   'S','C',2*0 /        !START OF SCALING INSTRUCTION.
  5194.     DATA STR_BEGIN_PLOT /
  5195.     1   'S','P','1',';',2*0/    !SELECT PEN 1
  5196.     DATA STR_COLOR_SET /
  5197.     1   'S','P','x',';',2*0 /    !SELECT PEN x
  5198.     DATA STR_PUT_PEN_AWAY /
  5199.     1   'P','U',';',        !PEN PUP, THEN
  5200.     1   'S','P','0',';',0/        !SELECT PEN 0 (PUT PEN AWAY)
  5201.     DATA STR_PLOTTER_ON /
  5202.     1   ESC,'.','(',0/        !PLOTTER ON
  5203.     DATA STR_PLOTTER_OFF /
  5204.     1   ESC,'.',')',0/        !PLOTTER OFF
  5205.     DATA STR_PEN_UP /
  5206.     1   'P','U',';',0/        !PEN UP
  5207.     DATA STR_PEN_DOWN /
  5208.     1   'P','D',';',0/        !PEN DOWN
  5209. C
  5210. C    DECLARE BUFFERING FUNCTION TO BE LOGICAL
  5211. C
  5212.     LOGICAL GB_TEST_FLUSH
  5213. C
  5214. C    DELCARE VARS NEEDED FOR DRIVER OPERATION
  5215. C
  5216.     LOGICAL LVECTOR_GOING, LTALL
  5217. C
  5218.     DIMENSION DCHAR(8)
  5219. C
  5220. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  5221. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  5222. C
  5223.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  5224.     DATA DCHAR /PLOTTER_ID, X_WIDTH_CM, Y_HEIGHT_CM,
  5225.     1   X_RESOLUTION, Y_RESOLUTION, NUMBER_FOREGROUND_COLORS,
  5226.     2   24.0, PEN_WIDTH_IN_PLOTTER_UNITS/
  5227. C
  5228. C-------------------------------------------------------------------------
  5229. C
  5230. C    REMEMBER THAT WE ARE PLOTTER LONG IF THRU THE TOP
  5231. C
  5232.     LTALL = .FALSE.
  5233.     GO TO 10
  5234. C
  5235. C    ######### ALTERNATE ENTRY POINT ###########
  5236. C
  5237.     ENTRY GD7475_TALL(IFXN,XA,YA)
  5238.     LTALL = .TRUE.
  5239. 10    CONTINUE
  5240. C
  5241. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  5242. C
  5243.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  5244. C
  5245. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  5246. C
  5247.     GO TO (100,200,300,400,500,600,700,800) IFXN
  5248. C
  5249. C    *********************
  5250. C    INITIALIZE THE DEVICE
  5251. C    *********************
  5252. C
  5253. 100    CONTINUE
  5254.     CALL GB_INITIALIZE(BSEMICOLON,0,TERMINAL,IERR)
  5255.     YA(1) = IERR
  5256.     IF (IERR .NE. 0) RETURN
  5257.     CALL GB_BEGIN_STRING(STR_PLOTTER_ON)
  5258. C
  5259.     CALL GB_IN_STRING(STR_INIT_DEVICE)
  5260.     CALL GDHPGLCONVERT(0,INT(X_RESOLUTION*X_WIDTH_CM))
  5261.     CALL GB_INSERT(BCOMMA)
  5262.     IY_FULL_SCALE = Y_RESOLUTION*Y_HEIGHT_CM
  5263.     CALL GDHPGLCONVERT(0,IY_FULL_SCALE)
  5264.     CALL GB_INSERT(BSEMICOLON)
  5265.     CALL GB_EMPTY
  5266.     RETURN
  5267. C
  5268. C    **************************
  5269. C    GET FRESH PLOTTING SURFACE
  5270. C    **************************
  5271. C
  5272. 200    CONTINUE
  5273.     CALL GB_NEW_BUFFER
  5274.     CALL GB_IN_STRING(STR_PUT_PEN_AWAY)
  5275.     CALL GB_EMPTY
  5276.     LVECTOR_GOING = .FALSE.
  5277.     IF (AUTO_PAGE_PLOTTER) THEN
  5278.         CALL GB_IN_STRING(STR_ADVANCE_PAPER)
  5279.         ELSE
  5280.         TYPE 299
  5281. 299        FORMAT(
  5282.     1    '$Please place a fresh sheet of paper on the HP Plotter')
  5283.         ACCEPT 298, I
  5284. 298        FORMAT(A1)
  5285.     ENDIF
  5286.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  5287.     RETURN
  5288. C
  5289. C    ****
  5290. C    MOVE
  5291. C    ****
  5292. C
  5293. 300    CONTINUE
  5294.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(20))
  5295.     IF (.NOT. LPEN_UP) THEN
  5296.         IF (LVECTOR_GOING) THEN
  5297.             CALL GB_INSERT(BSEMICOLON)
  5298.             LVECTOR_GOING = .FALSE.
  5299.         ENDIF
  5300.         CALL GB_IN_STRING(STR_PEN_UP)
  5301.         LPEN_UP = .TRUE.
  5302.     ENDIF
  5303.     GO TO 450
  5304. C
  5305. C    ****
  5306. C    DRAW
  5307. C    ****
  5308. C
  5309. 400    CONTINUE
  5310.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(20))
  5311.     IF (LPEN_UP) THEN
  5312.         IF (LVECTOR_GOING) THEN
  5313.             CALL GB_INSERT(BSEMICOLON)
  5314.             LVECTOR_GOING = .FALSE.
  5315.         ENDIF
  5316.         CALL GB_IN_STRING(STR_PEN_DOWN)
  5317.         LPEN_UP = .FALSE.
  5318.     ENDIF
  5319. 450    CONTINUE
  5320.     IXPOSN = XGUPCM*XA(1)+0.5
  5321.     IYPOSN = YGUPCM*YA(1)+0.5
  5322.     IF (LTALL) THEN
  5323. C                    PLOTTER X = TALL_Y
  5324. C                    PLOTTER Y = Y_FULL_SCALE - TALL_X
  5325.         ITEMP = IXPOSN
  5326.         IXPOSN = IYPOSN
  5327.         IYPOSN = IY_FULL_SCALE - ITEMP
  5328.     ENDIF
  5329.     IF (LVECTOR_GOING) THEN
  5330.         CALL GB_INSERT(BCOMMA)
  5331.         ELSE
  5332.         CALL GB_IN_STRING('PA')
  5333.         LVECTOR_GOING = .TRUE.
  5334.         CALL GB_USE_TERMINATOR
  5335.     ENDIF
  5336.     CALL GDHPGLCONVERT(IXPOSN,IYPOSN)
  5337.     RETURN
  5338. C
  5339. C    *****************************
  5340. C    FLUSH GRAPHICS COMMAND BUFFER
  5341. C    *****************************
  5342. C
  5343. 500    CONTINUE
  5344.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(6))
  5345.     IF (LVECTOR_GOING) THEN
  5346.         CALL GB_INSERT(BSEMICOLON)
  5347.         LVECTOR_GOING = .FALSE.
  5348.         CALL GB_NO_TERMINATOR
  5349.     ENDIF
  5350.     IF (.NOT. LPEN_UP) THEN
  5351.         CALL GB_IN_STRING(STR_PEN_UP)
  5352.         LPEN_UP = .TRUE.
  5353.     ENDIF
  5354.     CALL GB_EMPTY
  5355.     RETURN
  5356. C
  5357. C    ******************
  5358. C    RELEASE THE DEVICE
  5359. C    ******************
  5360. C
  5361. 600    CONTINUE
  5362.     CALL GB_EMPTY
  5363.     CALL GB_IN_STRING(STR_PUT_PEN_AWAY)
  5364.     CALL GB_IN_STRING('PA')
  5365.     CALL GDHPGLCONVERT(INT(X_RESOLUTION*X_WIDTH_CM),
  5366.     1   INT(Y_RESOLUTION*Y_HEIGHT_CM))
  5367.     CALL GB_INSERT(BSEMICOLON)
  5368.     CALL GB_EMPTY
  5369.     CALL GB_FINISH(STR_PLOTTER_OFF)
  5370.     RETURN
  5371. C
  5372. C    *****************************
  5373. C    RETURN DEVICE CHARACTERISTICS
  5374. C    *****************************
  5375. C
  5376. 700    CONTINUE
  5377.     DO 720 I=1,8
  5378.     XA(I) = DCHAR(I)
  5379. 720    CONTINUE
  5380.     IF (LTALL) THEN
  5381.         XA(2) = DCHAR(3)
  5382.         XA(3) = DCHAR(2)
  5383.         XA(4) = DCHAR(5)
  5384.         XA(5) = DCHAR(4)
  5385.     ENDIF
  5386.     RETURN
  5387. C
  5388. C    ****************************
  5389. C    SELECT CURRENT DRAWING COLOR
  5390. C    ****************************
  5391. C
  5392. 800    CONTINUE
  5393.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(10))
  5394.     ICOLOR = XA(1)
  5395.     IF (ICOLOR .LE. 0 .OR.
  5396.     1   ICOLOR .GT. INT(NUMBER_FOREGROUND_COLORS)) RETURN
  5397.     IF (LVECTOR_GOING) THEN
  5398.         CALL GB_INSERT(BSEMICOLON)
  5399.         LVECTOR_GOING = .FALSE.
  5400.         CALL GB_NO_TERMINATOR
  5401.     ENDIF
  5402.     IF (.NOT. LPEN_UP) THEN
  5403.         CALL GB_IN_STRING(STR_PEN_UP)
  5404.         LPEN_UP = .TRUE.
  5405.     ENDIF
  5406.     STR_COLOR_SET(3) = 48+ICOLOR
  5407.     CALL GB_IN_STRING(STR_COLOR_SET)
  5408.     RETURN
  5409.     END
  5410.     SUBROUTINE GB_INITIALIZE(TERMIN,ENDSTR,TTNAME,IERR)
  5411.     CHARACTER*(*) TTNAME
  5412.     BYTE ENDSTR(2), TERMIN
  5413. C
  5414. C    *** VMS SPECIFIC ***
  5415. C
  5416. C    THIS SUBROUTINE INITIALIZES THE GRAPHICS DRIVERS BUFFERING
  5417. C     SUBROUTINES
  5418. C
  5419.     INCLUDE 'GBCOMMON.CMN'
  5420. C
  5421.     INTEGER*4 SYS$ASSIGN
  5422.     EXTERNAL LEN
  5423. C
  5424. C    ASSIGN A CHANNEL TO THE DEVICE OUTPUT DEVICE
  5425. C
  5426.     ISTAT = SYS$ASSIGN(TTNAME,IOCHAN,,)
  5427.     IF (.NOT. ISTAT) THEN
  5428.         IERR = 1
  5429.         RETURN
  5430.         ELSE
  5431.         IERR = 0
  5432.     ENDIF
  5433. C
  5434.     CALL SCOPY(ENDSTR,END_STRING)
  5435.     IEND_LENGTH = LEN(END_STRING)
  5436. C
  5437.     TERM_CHAR = TERMIN
  5438. C
  5439.     CALL GB_NEW_BUFFER
  5440.     RETURN
  5441.     END
  5442.  
  5443.  
  5444.  
  5445.     SUBROUTINE GB_NEW_BUFFER
  5446. C
  5447. C    SUBROUTINE TO INITIALIZE THE GRAPHIC COMMAND BUFFER
  5448. C
  5449.     INCLUDE 'GBCOMMON.CMN'
  5450. C
  5451.     IBFPTR = 1
  5452.     L_USE_TERMINATOR = .FALSE.
  5453.     RETURN
  5454.     END
  5455.  
  5456.  
  5457.  
  5458.     FUNCTION GB_TEST_FLUSH(NUMCHR)
  5459.     LOGICAL GB_TEST_FLUSH
  5460. C
  5461. C    THIS SUBROUTINE CHECKS TO MAKE SURE THERE IS ENOUGH ROOM IN
  5462. C    THE BUFFER FOR "NUMCHR" MORE CHARACTERS, IF NOT, IF MAKES ROOM BY
  5463. C    EMPTYING THE BUFFER.
  5464. C
  5465.     INCLUDE 'GBCOMMON.CMN'
  5466. C
  5467.     IF (IBFPTR+NUMCHR+IEND_LENGTH .GE. IBFSIZ) THEN
  5468.         CALL GB_EMPTY
  5469.         GB_TEST_FLUSH = .TRUE.
  5470.         ELSE
  5471.         GB_TEST_FLUSH = .FALSE.
  5472.         ENDIF
  5473.     RETURN
  5474.     END
  5475.  
  5476.  
  5477.  
  5478.     SUBROUTINE GB_USE_TERMINATOR
  5479. C
  5480. C    THIS SUBROUTINE SETS THE "USE TERMINATOR" FLAG TO TRUE.
  5481. C    THE FLAG IS SET TO FALSE BY EMPTYING/CLEARING THE BUFFER.
  5482. C
  5483.     INCLUDE 'GBCOMMON.CMN'
  5484. C
  5485.     L_USE_TERMINATOR = .TRUE.
  5486.     RETURN
  5487.     END
  5488.  
  5489.  
  5490.  
  5491.     SUBROUTINE GB_EMPTY
  5492. C
  5493. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  5494. C
  5495.     INCLUDE 'GBCOMMON.CMN'
  5496. C
  5497. C
  5498.     IF (IBFPTR .EQ. 1) GO TO 900
  5499.     IF (L_USE_TERMINATOR) CALL GB_INSERT(TERM_CHAR)
  5500.     IF (IEND_LENGTH .NE. 0) CALL GB_IN_STRING(END_STRING)
  5501.     IF (IBFPTR .GT. IBFSIZ+1) STOP 'BUFFERING ERROR'
  5502. C
  5503. C    SEND TO TTY
  5504. C
  5505.     CALL GB_SEND_TTY(BUFFER,IBFPTR-1)
  5506. 900    CALL GB_NEW_BUFFER
  5507.     RETURN
  5508.     END
  5509.  
  5510.  
  5511.  
  5512.     SUBROUTINE GB_SEND_TTY(TTY_BUFFER,IBUFR_LEN)
  5513.     BYTE TTY_BUFFER(IBUFR_LEN)
  5514. C
  5515. C    *** VMS SPECIFIC ***
  5516. C
  5517. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  5518. C
  5519.     INCLUDE 'GBCOMMON.CMN'
  5520. C
  5521.     INTEGER*4 CR_CONTROL
  5522.     PARAMETER (CR_CONTROL = 0)
  5523.     PARAMETER (IO_WRITEV = '00000130'X)    !IO$_WRITEVBLK+IO$M_NOFORMAT
  5524. C
  5525.     INTEGER*4 SYS$QIOW
  5526.     INTEGER*2 IOSB(4)
  5527. C
  5528. C    DO THE QIOW TO THE OUTPUT DEVICE
  5529. C
  5530.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IO_WRITEV),IOSB, , ,
  5531.     1   TTY_BUFFER,%VAL(IBUFR_LEN), ,%VAL(CR_CONTROL), , )
  5532.     IF (.NOT. ISTAT) then
  5533.         type 999, istat
  5534. 999        format(' QIOW to terminal failed, status was ',i9)
  5535.       endif
  5536.     RETURN
  5537.     END
  5538.  
  5539.  
  5540.  
  5541.     SUBROUTINE GB_INSERT(BCHAR)
  5542.     BYTE BCHAR
  5543. C
  5544. C    THIS SUBROUTINE INSERTS A CHARACTER INTO THE BUFFER
  5545. C
  5546.     INCLUDE 'GBCOMMON.CMN'
  5547. C
  5548.     BUFFER(IBFPTR) = BCHAR
  5549.     IBFPTR = IBFPTR + 1
  5550.     RETURN
  5551.     END
  5552.  
  5553.  
  5554.     SUBROUTINE GB_IN_STRING(STRING)
  5555.     BYTE STRING(2)
  5556. C
  5557. C    THIS SUBROUTINE INSERTS THE STRING INTO THE GRAPHICS BUFFER
  5558. C
  5559.     EXTERNAL LEN
  5560. C
  5561.     DO 100 I=1, LEN(STRING)
  5562.       CALL GB_INSERT(STRING(I))
  5563. 100      CONTINUE
  5564.     RETURN
  5565.     END
  5566.  
  5567.  
  5568.     SUBROUTINE GB_FINISH(RELEASE_STRING)
  5569.     BYTE RELEASE_STRING(2)
  5570. C
  5571. C    *** VMS SPECIFIC ***
  5572. C
  5573. C    THIS SUBROUTINE RELEASES THE I/O CHANNAL TO THE OUTPUT DEVICE
  5574. C
  5575.     INCLUDE 'GBCOMMON.CMN'
  5576. C
  5577.     INTEGER*4 SYS$DASSGN
  5578.     EXTERNAL LEN
  5579. C
  5580.     IF (LEN(RELEASE_STRING) .NE. 0) THEN
  5581.         CALL GB_EMPTY
  5582.         CALL GB_IN_STRING(RELEASE_STRING)
  5583.         CALL GB_EMPTY
  5584.       ENDIF
  5585.     ISTAT = SYS$DASSGN(%VAL(IOCHAN))
  5586.     RETURN
  5587.     END
  5588.  
  5589.  
  5590.     SUBROUTINE GB_GIN(PROMPT,IGIN_CHARS_MAX,L_TERMS_OK,GINBUFR)
  5591.     BYTE GINBUFR(2), PROMPT(2)
  5592.     LOGICAL*1 L_TERMS_OK
  5593. C
  5594. C    *** VMS SPECIFIC ***
  5595. C
  5596. C    THIS SUBROUTINE DOES A GIN OPERATION VIA A "READ-AFTER-PROMPT"
  5597. C    QIOW.
  5598. C
  5599.     INCLUDE 'GBCOMMON.CMN'
  5600. C
  5601.     PARAMETER (IO_READ_PROMPT = '877'X)
  5602.     PARAMETER (IO_READ_NOECHO = '71'X)
  5603. C
  5604.     INTEGER*4 SYS$QIOW
  5605.     INTEGER*2 IOSB(4)
  5606.     EXTERNAL LEN
  5607. C
  5608.     IPRLEN = LEN(PROMPT)
  5609.     II = 1
  5610.     NUMBER_TO_GET = IGIN_CHARS_MAX
  5611.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IO_READ_PROMPT),
  5612.     1   IOSB, , ,GINBUFR(II),%VAL(NUMBER_TO_GET),%VAL(0), ,
  5613.     2   PROMPT,%VAL(IPRLEN))
  5614.     IF (.NOT. ISTAT) STOP 'GIN QIOW FAILED'
  5615.     IF (.NOT. L_TERMS_OK) GO TO 800
  5616. 100    CONTINUE
  5617.     NUMBER_GOT = IOSB(2)+IOSB(4)
  5618. D    TYPE 9999, NUMBER_GOT, (GINBUFR(I), I=1,NUMBER_GOT+II-1)
  5619. D9999    FORMAT(/' GB_GIN just got ',I2,' characters.'
  5620. D    1   /' The characters buffered so far are:'
  5621. D    2   /,20(1X,I3))
  5622.     IF (NUMBER_GOT .GE. NUMBER_TO_GET) GOTO 800
  5623.     NUMBER_TO_GET = NUMBER_TO_GET - NUMBER_GOT
  5624.     II = NUMBER_GOT + II
  5625.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IO_READ_NOECHO),
  5626.     1   IOSB, , ,GINBUFR(II),%VAL(NUMBER_TO_GET), , , , )
  5627.     IF (.NOT. ISTAT) STOP 'GIN QIOW FAILED'
  5628.     GO TO 100
  5629. 800    RETURN
  5630.     END
  5631.  
  5632.  
  5633.  
  5634.     SUBROUTINE GB_INTERLOCK(PROMPT,IN_BUFFER,IN_CHAR_COUNT)
  5635. C
  5636. C    *** VMS SPECIFIC ***
  5637. C
  5638. C    THIS SUBROUTINE IS USED BY THOSE DRIVERS THAT MUST USE AN INTERLOCKING
  5639. C      WITH THE TERMINAL SO THAT BUFFER OVERFLOW DOES NOT OCCUR IN THE
  5640. C      TERMINAL.   MOSTLY, THIS IS CAUSED BY HP TERMINALS.   IT SEEMS
  5641. C      THAT HP NEVER HAS UNDERSTOOD THE USEFULNESS OF XON/XOFF!
  5642. C
  5643.     INCLUDE 'GBCOMMON.CMN'
  5644. C
  5645.     PARAMETER (IO_READ_PROMPT = '877'X)
  5646. C        IO$_READPROMPT + IO$M_PURGE + IO$M_NOECHO
  5647. C
  5648.     INTEGER*4 SYS$QIOW
  5649.     INTEGER*2 IOSB(4)
  5650.     EXTERNAL LEN
  5651. C
  5652.     IPRLEN = LEN(PROMPT)
  5653.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),%VAL(IO_READ_PROMPT),
  5654.     1   IOSB, , ,IN_BUFFER,%VAL(IN_CHAR_COUNT),%VAL(0),%VAL(0),
  5655.     2   PROMPT,%VAL(IPRLEN))
  5656.     IF (.NOT. ISTAT) STOP 'GIN QIOW FAILED'
  5657.     RETURN
  5658.     END
  5659.     SUBROUTINE GB_INITIALIZE(TERMIN,ENDSTR,TTNAME,IERR)
  5660.     CHARACTER*(*) TTNAME
  5661.     BYTE ENDSTR(2), TERMIN
  5662. C
  5663. C    *** VMS SPECIFIC ***
  5664. C
  5665. C    THIS SUBROUTINE INITIALIZES THE GRAPHICS DRIVERS BUFFERING
  5666. C     SUBROUTINES FOR DOUBLE BUFFERING
  5667. C    DOUBLE BUFFERING ADDED 18-OCT-1984
  5668. C
  5669.     INCLUDE 'GBCOMMON2.CMN'
  5670. C
  5671.     INTEGER*4 SYS$ASSIGN, SYS$SETEF, LIB$GET_EF
  5672.     EXTERNAL LEN
  5673. C
  5674. C    ASSIGN A CHANNEL TO THE DEVICE OUTPUT DEVICE
  5675. C
  5676.     ISTAT = SYS$ASSIGN(TTNAME,IOCHAN,,)
  5677.     IF (.NOT. ISTAT) THEN
  5678.         IERR = 1
  5679.         RETURN
  5680.     ENDIF
  5681. C
  5682. C    GET TWO FREE EVENT FLAGS, 1 FOR EACH BUFFER
  5683. C
  5684.     ISTAT = LIB$GET_EF(IFLAG(1))
  5685. D    TYPE *,'EVENT FLAG 1 IS ',IFLAG(1)
  5686.     IF (.NOT. ISTAT) THEN
  5687.         IERR = 1
  5688.         RETURN
  5689.     ENDIF
  5690.     ISTAT = LIB$GET_EF(IFLAG(2))
  5691. D    TYPE *,'EVENT FLAG 2 IS ',IFLAG(2)
  5692.     IF (.NOT. ISTAT) THEN
  5693.         IERR = 1
  5694.         RETURN
  5695.         ELSE
  5696.         IERR = 0
  5697.     ENDIF
  5698.     IACTIVE_BUFFER = 1
  5699.     ISTAT = SYS$SETEF(%VAL(IFLAG(1)))
  5700. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5701.     ISTAT = SYS$SETEF(%VAL(IFLAG(2)))
  5702. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5703. C
  5704.     CALL SCOPY(ENDSTR,END_STRING)
  5705.     IEND_LENGTH = LEN(END_STRING)
  5706.     BEGIN_STRING(1) = 0
  5707.     IBEGIN_LENGTH = 0
  5708. C
  5709.     TERM_CHAR = TERMIN
  5710. C
  5711.     CALL GB_INIT_BUFFER
  5712.     RETURN
  5713.     END
  5714.  
  5715.  
  5716.     SUBROUTINE GB_BEGIN_STRING(STRING)
  5717. C
  5718. C    THIS SUBROUTINE SETS THE "BEGINNING OF EACH BUFFER STRING"
  5719. C     IT SHOULD BE CALLED ONCE IMMEDIATELY AFTER CALLING GB_INITIALIZE
  5720. C
  5721.     EXTERNAL LEN
  5722. C
  5723.     CALL SCOPY(STRING,BEGIN_STRING)
  5724.     IBEGIN_LENGTH = LEN(BEGIN_STRING)
  5725.     CALL GB_INIT_BUFFER
  5726.     RETURN
  5727.     END
  5728.  
  5729.  
  5730.  
  5731.     SUBROUTINE GB_NEW_BUFFER
  5732. C
  5733. C    SUBROUTINE TO INITIALIZE THE GRAPHIC COMMAND BUFFER
  5734. C
  5735.     INCLUDE 'GBCOMMON2.CMN'
  5736. C
  5737.     INTEGER*4 SYS$WAITFR
  5738. C
  5739.     IACTIVE_BUFFER = IACTIVE_BUFFER+1
  5740.     IF (IACTIVE_BUFFER .GT. 2) IACTIVE_BUFFER = 1
  5741. D    TYPE *,'IACTIVE_BUFFER IS ',IACTIVE_BUFFER
  5742. D    TYPE *,'THAT FLAG IS ',IFLAG(IACTIVE_BUFFER)
  5743. C
  5744. C    MAKE SURE THIS NEW BUFFER IS EMPTY, IF NOT, WAIT FOR IT
  5745. C    TO EMPTY
  5746. C
  5747.     ISTAT = SYS$WAITFR(%VAL(IFLAG(IACTIVE_BUFFER)))
  5748. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5749.     GO TO 100
  5750. C
  5751.     ENTRY GB_INIT_BUFFER()
  5752. C
  5753. 100    CALL SCOPY(BEGIN_STRING,BUFFER(1,IACTIVE_BUFFER))
  5754.     IBFPTR = IBEGIN_LENGTH + 1
  5755.     L_USE_TERMINATOR = .FALSE.
  5756.     RETURN
  5757.     END
  5758.  
  5759.  
  5760.  
  5761.     FUNCTION GB_TEST_FLUSH(NUMCHR)
  5762.     LOGICAL GB_TEST_FLUSH
  5763. C
  5764. C    THIS SUBROUTINE CHECKS TO MAKE SURE THERE IS ENOUGH ROOM IN
  5765. C    THE BUFFER FOR "NUMCHR" MORE CHARACTERS, IF NOT, IF MAKES ROOM BY
  5766. C    EMPTYING THE BUFFER.
  5767. C
  5768.     INCLUDE 'GBCOMMON2.CMN'
  5769. C
  5770.     IF (IBFPTR+NUMCHR+IEND_LENGTH .GE. IBFSIZ) THEN
  5771.         CALL GB_EMPTY
  5772.         GB_TEST_FLUSH = .TRUE.
  5773.         ELSE
  5774.         GB_TEST_FLUSH = .FALSE.
  5775.         ENDIF
  5776.     RETURN
  5777.     END
  5778.  
  5779.  
  5780.  
  5781.     SUBROUTINE GB_USE_TERMINATOR
  5782. C
  5783. C    THIS SUBROUTINE SETS THE "USE TERMINATOR" FLAG TO TRUE.
  5784. C    THE FLAG IS SET TO FALSE BY CALLING GB_NO_TERMINATOR OR BY
  5785. C    EMPTYING/CLEARING THE BUFFER.
  5786. C
  5787.     INCLUDE 'GBCOMMON2.CMN'
  5788. C
  5789.     L_USE_TERMINATOR = .TRUE.
  5790.     RETURN
  5791.     END
  5792.  
  5793.  
  5794.  
  5795.     SUBROUTINE GB_NO_TERMINATOR
  5796. C
  5797. C    THIS SUBROUTINE CLEARS THE "USE TERMINATOR" FLAG TO FALSE.
  5798. C
  5799.     INCLUDE 'GBCOMMON2.CMN'
  5800. C
  5801.     L_USE_TERMINATOR = .FALSE.
  5802.     RETURN
  5803.     END
  5804.  
  5805.  
  5806.  
  5807.     SUBROUTINE GB_EMPTY
  5808. C
  5809. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  5810. C
  5811.     INCLUDE 'GBCOMMON2.CMN'
  5812.     INTEGER*2 IOSB(4,2)
  5813. C
  5814. C
  5815.     IF (IBFPTR-1 .LE. IBEGIN_LENGTH) THEN
  5816.         CALL GB_INIT_BUFFER
  5817.         RETURN
  5818.     ENDIF
  5819.     IF (L_USE_TERMINATOR) CALL GB_INSERT(TERM_CHAR)
  5820.     IF (IEND_LENGTH .NE. 0) CALL GB_IN_STRING(END_STRING)
  5821.     IF (IBFPTR .GT. IBFSIZ+1) STOP 'BUFFERING ERROR - BUFFER OVERFLOWED'
  5822. C
  5823. C    SEND TO TTY
  5824. C
  5825.     CALL GB_SEND_TTY(BUFFER(1,IACTIVE_BUFFER),
  5826.     1   IBFPTR-1,IFLAG(IACTIVE_BUFFER),IOSB(1,IACTIVE_BUFFER))
  5827.     CALL GB_NEW_BUFFER
  5828.     RETURN
  5829.     END
  5830.  
  5831.  
  5832.  
  5833.     SUBROUTINE GB_SEND_CHARS(STRING,LENGTH)
  5834.     BYTE STRING(LENGTH)
  5835. C
  5836.     INTEGER*2 IOSB(4)
  5837. C
  5838.     CALL GB_SEND_TTY(STRING,LENGTH,0,IOSB)
  5839.     RETURN
  5840.     END
  5841.  
  5842.  
  5843.  
  5844.     SUBROUTINE GB_SEND_TTY(TTY_BUFFER,IBUFR_LEN,IEVFLAG,IOSB)
  5845.     BYTE TTY_BUFFER(IBUFR_LEN)
  5846.     INTEGER*2 IOSB(4)
  5847. C
  5848. C    *** VMS SPECIFIC ***
  5849. C    NOTE: FOR INTERNAL USE ONLY.   NO DRIVERS SHOULD CALL THIS ROUTINE.
  5850. C    DRIVERS SHOULD USE GB_SEND_CHARS INSTEAD.
  5851. C
  5852. C    THIS SUBROUTINE EMPTYS THE BUFFER IF IT HAS ANYTHING
  5853. C
  5854.     INCLUDE '($IODEF)'
  5855. C    PARAMETER (IO_WRITEV = '00000130'X)    !IO$_WRITEVBLK+IO$M_NOFORMAT
  5856.     INCLUDE '($SSDEF)'
  5857.     INCLUDE 'GBCOMMON2.CMN'
  5858. C
  5859.     INTEGER*4 CR_CONTROL
  5860.     PARAMETER (CR_CONTROL = 0)
  5861. C
  5862.     INTEGER*4 SYS$QIO
  5863. C
  5864. C    DO THE QIO TO THE OUTPUT DEVICE
  5865. C
  5866. 10    CONTINUE
  5867.     ISTAT = SYS$QIO(%VAL(IEVFLAG),%VAL(IOCHAN),
  5868.     1   %VAL(IO$_WRITEVBLK+IO$M_NOFORMAT),
  5869.     2   IOSB, , ,
  5870.     3   TTY_BUFFER,%VAL(IBUFR_LEN), ,%VAL(CR_CONTROL), , )
  5871.     IF (.NOT. ISTAT) then
  5872.         type 999, istat
  5873. 999        format(' QIOW to terminal failed, status was ',i9)
  5874.     ENDIF
  5875.     RETURN
  5876.     END
  5877.  
  5878.  
  5879.  
  5880.     SUBROUTINE GB_INSERT(BCHAR)
  5881.     BYTE BCHAR
  5882. C
  5883. C    THIS SUBROUTINE INSERTS A CHARACTER INTO THE BUFFER
  5884. C
  5885.     INCLUDE 'GBCOMMON2.CMN'
  5886. C
  5887.     BUFFER(IBFPTR,IACTIVE_BUFFER) = BCHAR
  5888.     IBFPTR = IBFPTR + 1
  5889.     RETURN
  5890.     END
  5891.  
  5892.  
  5893.     SUBROUTINE GB_IN_STRING(STRING)
  5894.     BYTE STRING(80)
  5895. C
  5896. C    THIS SUBROUTINE INSERTS THE STRING INTO THE GRAPHICS BUFFER
  5897. C
  5898.     EXTERNAL LEN
  5899. C
  5900.     DO 100 I=1, LEN(STRING)
  5901.       CALL GB_INSERT(STRING(I))
  5902. 100      CONTINUE
  5903.     RETURN
  5904.     END
  5905.  
  5906.  
  5907.     SUBROUTINE GB_FINISH(RELEASE_STRING)
  5908.     BYTE RELEASE_STRING(2)
  5909. C
  5910. C    *** VMS SPECIFIC ***
  5911. C
  5912. C    THIS SUBROUTINE RELEASES THE I/O CHANNAL TO THE OUTPUT DEVICE
  5913. C
  5914.     INCLUDE 'GBCOMMON2.CMN'
  5915. C
  5916.     INTEGER*4 SYS$DASSGN, SYS$WAITFR
  5917.     EXTERNAL LEN
  5918. C
  5919.     IF (LEN(RELEASE_STRING) .NE. 0) THEN
  5920.         CALL GB_EMPTY
  5921.         CALL GB_IN_STRING(RELEASE_STRING)
  5922.         CALL GB_EMPTY
  5923.       ENDIF
  5924.     ISTAT = SYS$WAITFR(%VAL(IFLAG(1)))
  5925. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5926.     ISTAT = SYS$WAITFR(%VAL(IFLAG(2)))
  5927. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5928.     ISTAT = SYS$DASSGN(%VAL(IOCHAN))
  5929. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5930.     ISTAT = LIB$FREE_EF(IFLAG(1))
  5931. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5932.     ISTAT = LIB$FREE_EF(IFLAG(2))
  5933. D    IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5934.     RETURN
  5935.     END
  5936.  
  5937.  
  5938.     SUBROUTINE GB_GIN(PROMPT,IGIN_CHARS_MAX,L_TERMS_OK,GINBUFR)
  5939.     BYTE GINBUFR(2), PROMPT(2)
  5940.     LOGICAL*1 L_TERMS_OK
  5941. C
  5942. C    *** VMS SPECIFIC ***
  5943. C
  5944. C    THIS SUBROUTINE DOES A GIN OPERATION VIA A "READ-AFTER-PROMPT"
  5945. C    QIOW.
  5946. C
  5947.     INCLUDE 'GBCOMMON2.CMN'
  5948. C
  5949. C    PARAMETER (IO_READ_PROMPT = '877'X)
  5950. C    PARAMETER (IO_READ_NOECHO = '71'X)
  5951.     INCLUDE '($IODEF)'
  5952. C
  5953.     INTEGER*4 SYS$QIOW
  5954.     INTEGER*2 IOSB(4)
  5955.     EXTERNAL LEN
  5956. C
  5957.     IPRLEN = LEN(PROMPT)
  5958.     IF (IPRLEN .EQ. 0) THEN
  5959.         IFXN = IO$_READVBLK + IO$M_NOECHO
  5960.         ELSE
  5961.         IFXN = IO$_READPROMPT + IO$M_PURGE + IO$M_NOECHO
  5962.     ENDIF
  5963.     II = 1
  5964.     NUMBER_TO_GET = IGIN_CHARS_MAX
  5965.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  5966.     1   %VAL(IFXN),
  5967.     1   IOSB, , ,GINBUFR(II),%VAL(NUMBER_TO_GET),%VAL(0), ,
  5968.     2   PROMPT,%VAL(IPRLEN))
  5969.     IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5970.     IF (.NOT. L_TERMS_OK) GO TO 800
  5971. 100    CONTINUE
  5972.     NUMBER_GOT = IOSB(2)+IOSB(4)
  5973. D    TYPE 9999, NUMBER_GOT, (GINBUFR(I), I=1,NUMBER_GOT+II-1)
  5974. D9999    FORMAT(/' GB_GIN just got ',I2,' characters.'
  5975. D    1   /' The characters buffered so far are:'
  5976. D    2   /,20(1X,I3))
  5977.     IF (NUMBER_GOT .GE. NUMBER_TO_GET) GOTO 800
  5978.     NUMBER_TO_GET = NUMBER_TO_GET - NUMBER_GOT
  5979.     II = NUMBER_GOT + II
  5980.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  5981.     1   %VAL(IO$_READVBLK+IO$M_NOECHO),
  5982.     1   IOSB, , ,GINBUFR(II),%VAL(NUMBER_TO_GET), , , , )
  5983.     IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  5984.     GO TO 100
  5985. 800    RETURN
  5986.     END
  5987.  
  5988.  
  5989.  
  5990.     SUBROUTINE GB_INTERLOCK(PROMPT,IN_BUFFER,IN_CHAR_COUNT)
  5991. C
  5992. C    *** VMS SPECIFIC ***
  5993. C
  5994. C    THIS SUBROUTINE IS USED BY THOSE DRIVERS THAT MUST USE AN INTERLOCKING
  5995. C      WITH THE TERMINAL SO THAT BUFFER OVERFLOW DOES NOT OCCUR IN THE
  5996. C      TERMINAL.   MOSTLY, THIS IS CAUSED BY HP TERMINALS.   IT SEEMS
  5997. C      THAT HP NEVER HAS UNDERSTOOD THE USEFULNESS OF XON/XOFF!
  5998. C
  5999.     INCLUDE 'GBCOMMON2.CMN'
  6000. C
  6001.     INCLUDE '($IODEF)'
  6002. C    PARAMETER (IO_READ_PROMPT = '877'X)
  6003. C        IO$_READPROMPT + IO$M_PURGE + IO$M_NOECHO
  6004. C
  6005.     INTEGER*4 SYS$QIOW
  6006.     INTEGER*2 IOSB(4)
  6007.     EXTERNAL LEN
  6008. C
  6009.     IPRLEN = LEN(PROMPT)
  6010.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  6011.     1   %VAL(IO$_READPROMPT+IO$M_NOECHO+IO$M_PURGE),
  6012.     2   IOSB, , ,IN_BUFFER,%VAL(IN_CHAR_COUNT),%VAL(0),%VAL(0),
  6013.     3   PROMPT,%VAL(IPRLEN))
  6014.     IF (.NOT. ISTAT) STOP 'INTERLOCK QIOW FAILED'
  6015.     RETURN
  6016.     END
  6017.  
  6018.  
  6019.  
  6020.     SUBROUTINE GB_OUTPUT_BUFFER(BUFFER,IBUFLEN)
  6021.     BYTE BUFFER(IBUFLEN)
  6022. C
  6023. C    SUBROUTINE TO OUTPUT A BUFFER
  6024. C
  6025.     INTEGER*2 IOSB(4)
  6026.     INTEGER*4 LIB$GET_EF, SYS$WAITFR
  6027. C
  6028.     DATA IEVFLAG /-1/
  6029. C
  6030.     IF (IEVFLAG .LT. 0) THEN
  6031.         ISTAT = LIB$GET_EF(IEVFLAG)
  6032.     ENDIF
  6033.     CALL GB_SEND_TTY(BUFFER,IBUFLEN,IEVFLAG,IOSB)
  6034. CCCC    ISTAT = SYS$WAITFR(%VAL(IEVFLAG))
  6035.     RETURN
  6036.     END
  6037.  
  6038.  
  6039.  
  6040.     SUBROUTINE GB_INPUT_BUFFER(PROMPT,IPRLEN,
  6041.     1   IN_BUFFER,IN_CHAR_COUNT,IGOT)
  6042. C
  6043. C    *** VMS SPECIFIC ***
  6044. C
  6045. C    SUBROUTINE TO READ IN A BUFFER AFTER ISSUING A PROMPT
  6046. C
  6047.     INCLUDE '($IODEF)'
  6048. C    PARAMETER (IO_READ_PROMPT = '877'X)
  6049. C        IO$_READPROMPT + IO$M_PURGE + IO$M_NOECHO
  6050. C
  6051.     INCLUDE 'GBCOMMON2.CMN'
  6052. C
  6053.     INTEGER*4 SYS$QIOW, IOTERMS(2)
  6054.     INTEGER*2 IOSB(4)
  6055. C
  6056.     DATA IOTERMS /0,'2000'X/ !<CR> IS ONLY TERMINATOR
  6057. C
  6058.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHAN),
  6059.     1   %VAL(IO$_READPROMPT+IO$M_NOECHO+IO$M_PURGE),
  6060.     2   IOSB, , ,IN_BUFFER,%VAL(IN_CHAR_COUNT),%VAL(0),IOTERMS,
  6061.     3   PROMPT,%VAL(IPRLEN))
  6062.     IF (.NOT. ISTAT) CALL LIB$STOP(%VAL(ISTAT))
  6063.     IGOT = IOSB(2)
  6064.     RETURN
  6065.     END
  6066.     SUBROUTINE GDLASER_WIDE(IFXN,XA,YA)
  6067.     DIMENSION XA(8), YA(3)
  6068. C
  6069. C    QMS 1200 LASER PRINTER DRIVER - MULTIPLE COMMANDS ON A SINGLE LINE
  6070. C
  6071. C-----------------------------------------------------------------------
  6072. C
  6073. C    DECLARE VARS NEED FOR DRIVER OPERATION
  6074. C
  6075.     LOGICAL*1 L_NOTHING_PLOTTED, L_WIDE
  6076.     BYTE COORD(12)
  6077. C
  6078.     DIMENSION DCHAR(8)
  6079. C
  6080. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  6081. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  6082. C
  6083.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  6084.     DATA DCHAR /1200.0, 26.67, 19.685, 118.11, 118.11, 1.0, 27.0, 3.0/
  6085. C
  6086.     L_WIDE = .TRUE.
  6087. 10    CONTINUE
  6088. C
  6089. C*****************
  6090. C
  6091. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  6092. C
  6093.     IF (IFXN .LE. 0 .OR. IFXN .GT. 7) RETURN
  6094. C
  6095. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  6096. C
  6097.     GO TO (100,200,300,400,500,600,700) IFXN
  6098. C
  6099. C    *********************
  6100. C    INITIALIZE THE DEVICE
  6101. C    *********************
  6102. C
  6103. 100    CONTINUE
  6104.     LUN = XA(1)
  6105.     OPEN (UNIT=LUN,NAME='SYS$SCRATCH:LASER.DIG',TYPE='NEW',
  6106.     1   CARRIAGECONTROL='LIST',ERR=9000)
  6107. C
  6108. C    SHOW INITIALIZATION WORKED, I.E. WE OPENED THE FILE.
  6109. C
  6110.     YA(1) = 0.0
  6111.     WRITE (LUN,101)
  6112. 101    FORMAT('^PY^-'/'^F'/'^IGV ^PW03')
  6113. 190    CONTINUE
  6114.     CALL GDLSR_OPEN_BUFR(LUN)
  6115.     L_NOTHING_PLOTTED = .TRUE.
  6116.     L_PEN_IS_UP = .FALSE.
  6117.     RETURN
  6118. C
  6119. C    **************************
  6120. C    GET FRESH PLOTTING SURFACE
  6121. C    **************************
  6122. C
  6123. 200    CONTINUE
  6124.     IF (L_NOTHING_PLOTTED) RETURN
  6125.     CALL GDLSR_DUMP_BUFR
  6126.     WRITE (LUN,201)
  6127. 201    FORMAT('^,')
  6128.     GO TO 190
  6129. C
  6130. C    ****
  6131. C    MOVE
  6132. C    ****
  6133. C
  6134. 300    CONTINUE
  6135.     IF (L_PEN_IS_UP) GO TO 450
  6136.     L_PEN_IS_UP = .TRUE.
  6137.     CALL GDLSR_INSERT('^U')
  6138.     GO TO 450
  6139. C
  6140. C    ****
  6141. C    DRAW
  6142. C    ****
  6143. C
  6144. 400    CONTINUE
  6145.     IF (.NOT. L_PEN_IS_UP) GO TO 450
  6146.     CALL GDLSR_INSERT('^D')
  6147.     L_PEN_IS_UP = .FALSE.
  6148. 450    CONTINUE
  6149.     IF (L_WIDE) THEN
  6150.         IX = (10.0*XGUPCM*XA(1)/3.0)+0.5
  6151.         IY = (10.0*YGUPCM*(DCHAR(3)-YA(1))/3.0)+0.5
  6152.         ELSE
  6153.         IX = (10.0*XGUPCM*YA(1)/3.0) + 0.5
  6154.         IY = (10.0*YGUPCM*XA(1)/3.0) + 0.5
  6155.     ENDIF
  6156.     ENCODE (11,451,COORD) IX,IY
  6157. 451    FORMAT(I5,':',I5)
  6158.     DO 460 I=1,11
  6159.         IF (COORD(I) .EQ. 32) COORD(I) = 48
  6160. 460        CONTINUE
  6161.     COORD(12) = 0
  6162.     CALL GDLSR_INSERT(COORD)
  6163.     L_NOTHING_PLOTTED = .FALSE.
  6164.     RETURN
  6165. C
  6166. C    *****************************
  6167. C    FLUSH GRAPHICS COMMAND BUFFER
  6168. C    *****************************
  6169. C
  6170. 500    CONTINUE
  6171.     RETURN        !DONE BY BGNPLT WHEN NECESSARY.
  6172. C
  6173. C    ******************
  6174. C    RELEASE THE DEVICE
  6175. C    ******************
  6176. C
  6177. 600    CONTINUE
  6178. CC    IF (.NOT. L_NOTHING_PLOTTED) WRITE (LUN,602)
  6179. CC602    FORMAT('^,')
  6180.     CALL GDLSR_DUMP_BUFR
  6181.     WRITE (LUN,601)
  6182. 601    FORMAT('^IGE'/'^O'/'^PN^-')
  6183.     CLOSE (UNIT=LUN)
  6184.     ISTATUS = LIB$SPAWN('$ DIGLASEROUT SYS$SCRATCH:LASER.DIG')
  6185.     RETURN
  6186. C
  6187. C    *****************************
  6188. C    RETURN DEVICE CHARACTERISTICS
  6189. C    *****************************
  6190. C
  6191. 700    CONTINUE
  6192.     DO 720 I=1,8
  6193.     XA(I) = DCHAR(I)
  6194. 720    CONTINUE
  6195.     IF (.NOT. L_WIDE) THEN
  6196.         XA(2) = DCHAR(3)
  6197.         XA(3) = DCHAR(2)
  6198.     ENDIF
  6199.     RETURN
  6200. C
  6201. C    HANDLE FILE OPEN ERROR
  6202. C
  6203. 9000    CONTINUE
  6204.     YA(1) = 3.0
  6205.     RETURN
  6206. C
  6207. C    ***********************************************************
  6208. C
  6209.     ENTRY GDLASER_TALL(IFXN,XA,YA)
  6210.     L_WIDE = .FALSE.
  6211.     GO TO 10
  6212.     END
  6213.  
  6214.  
  6215.     SUBROUTINE GDLSR_OPEN_BUFR(LUN)
  6216. C
  6217.     PARAMETER (IBUFR_SIZE = 120)
  6218.     BYTE BUFFER
  6219.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  6220. C
  6221.     LUNOUT = LUN
  6222.     NXTCHR = 1
  6223.     RETURN
  6224.     END
  6225.  
  6226.  
  6227.     SUBROUTINE GDLSR_INIT_BUFR
  6228. C
  6229.     PARAMETER (IBUFR_SIZE = 120)
  6230.     BYTE BUFFER
  6231.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  6232. C
  6233.     NXTCHR = 1
  6234.     RETURN
  6235.     END
  6236.  
  6237.  
  6238.     SUBROUTINE GDLSR_INSERT(STRING)
  6239.     BYTE STRING(2)
  6240. C
  6241.     PARAMETER (IBUFR_SIZE = 120)
  6242.     BYTE BUFFER
  6243.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  6244. C
  6245.     EXTERNAL LEN
  6246. C
  6247.     L = LEN(STRING)
  6248.     IF ((NXTCHR+L) .GT. IBUFR_SIZE) CALL GDLSR_DUMP_BUFR
  6249.         DO 100 I = 1, L
  6250.         BUFFER(NXTCHR) = STRING(I)
  6251.         NXTCHR = NXTCHR + 1
  6252. 100        CONTINUE
  6253.     RETURN
  6254.     END
  6255.  
  6256.     SUBROUTINE GDLSR_DUMP_BUFR
  6257. C
  6258.     PARAMETER (IBUFR_SIZE = 120)
  6259.     BYTE BUFFER
  6260.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  6261. C
  6262.     IF (NXTCHR .EQ. 1) RETURN
  6263.     WRITE (LUNOUT,11) (BUFFER(I), I=1,NXTCHR-1)
  6264. 11    FORMAT(132A1)
  6265.     NXTCHR = 1
  6266.     RETURN
  6267.     END
  6268.     SUBROUTINE GDLEX(IFXN,XA,YA)
  6269.     DIMENSION XA(8), YA(3)
  6270. C
  6271. C    LEXIDATA 3400 DRIVER FOR VAX/VMS
  6272. C
  6273. C-----------------------------------------------------------------------
  6274. C
  6275.     PARAMETER (MAXY=511)
  6276.     CHARACTER*(*) DEVICE_NAME
  6277.     PARAMETER (DEVICE_NAME='LXA0:')
  6278.  
  6279.     INTEGER LX_BUFFER_SIZE
  6280.     PARAMETER (LX_BUFFER_SIZE = 512)
  6281.     PARAMETER (LX_COMMAND_LOAD_LUT = 20)
  6282.     PARAMETER (LX_COMMAND_CVEC = 41)
  6283.     PARAMETER (LX_COMMAND_POLY = 42)
  6284.  
  6285. C
  6286. C    DEFINE BUFFER STATES FOR "LX_BUFFER_STATUS"
  6287. C
  6288.     INTEGER NO_VECTOR, VECTOR_MOVE, VECTOR_DRAW
  6289.     PARAMETER (NO_VECTOR = 0)
  6290.     PARAMETER (VECTOR_MOVE = 1)
  6291.     PARAMETER (VECTOR_DRAW = 2)
  6292.  
  6293.     DIMENSION DCHAR(8)
  6294.     INTEGER*2 BUFFER(LX_BUFFER_SIZE)
  6295.     INTEGER*2 LX_ERASE_INIT(55)
  6296.     INTEGER*2 LX_CURSOR(4), LX_READ_CURSOR(5)
  6297.  
  6298.     INTEGER*4 SYS$ASSIGN, SYS$QIOW, SYS$DASSGN
  6299.     INTEGER*2 IOCHANTT
  6300.  
  6301.     BYTE CHARBUFR
  6302. C
  6303. C    FUNNY BUSINESS NEEDED TO PREVENT "INTEGER OVERFLOW" MESSAGE
  6304. C
  6305.     INTEGER*4 IX
  6306.     INTEGER*2 IXEQ(2)
  6307.     EQUIVALENCE (IX,IXEQ(1))
  6308. C
  6309. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  6310. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  6311. C
  6312.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  6313. C
  6314. C    DATA WE WILL NEED
  6315. C
  6316.     DATA DCHAR /3400, 32.79, 26.23, 19.5, 19.5, 1023.0, 981.0, 1.0/
  6317.     DATA IOREADNOECHO /'00000071'X/
  6318.  
  6319.     DATA LX_ERASE_INIT / 3,4095,    !ERASE ALL 12 PLANES
  6320.     1   24,639,511,20,        !CONFIGURE
  6321.     1   10,0,0,1,            !NO ZOOM OR PAN
  6322.     2   2,1023,1023,1023,        !ENABLE FIRST 10 BIT PLANES
  6323.     3   27,                !ERASE MATRIX CURSOR
  6324.     4   26,2,76,32,            !SELECT MATRIX CURSOR WITH OFFSETS
  6325.     5   7,0,0,            !ZERO LITES
  6326.     6   20,1024,8,0,255,255,0,0,255,255,0,    !RED PORTION LUT 0->7
  6327.     7   20,2048,8,0,255,0,255,0,255,0,255,    !GREEN PART
  6328.     8   20,3072,8,0,255,0,0,255,0,255,255/    !BLUE PART
  6329.     DATA LX_ERASE_INIT_WORDS /55/
  6330.     DATA LX_INIT_START /3/
  6331.  
  6332.     DATA LX_CURSOR /26, 0, 76, 38/    !SELECT CROSS HAIR CURSOR
  6333.     DATA LX_CURSOR_WORDS /4/
  6334.     DATA LX_READ_CURSOR /26, 2, 76, 38,    !SELECT MATRIX CURSOR
  6335.     1   5/                    !READ X,Y,SWITCHES
  6336.     DATA LX_READ_CURSOR_WORDS /5/
  6337.  
  6338. C
  6339. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  6340. C
  6341.     IF (IFXN .GE. 1027) GO TO 20000    !POLYGON
  6342.     IF (IFXN .LE. 0 .OR. IFXN .GT. 10) RETURN
  6343. C
  6344. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  6345. C
  6346.     GO TO (100,200,300,300,500,600,700,800,900,1000) IFXN
  6347. C
  6348. C    *********************
  6349. C    INITIALIZE THE DEVICE
  6350. C    *********************
  6351. C
  6352. 100    CONTINUE
  6353. C
  6354. C    FIND THE I/O CHANNAL ASSICIATED WITH THE TERMINAL FOR DOING GINS
  6355. C
  6356.     ISTAT = LX_OPEN()
  6357.     IF (ISTAT .NE. 1) THEN
  6358.         YA(1) = 2.0
  6359.         RETURN
  6360.     ENDIF
  6361.     ISTAT = SYS$ASSIGN('TT',IOCHANTT,,)
  6362.     IF (.NOT. ISTAT) THEN
  6363.         YA(1) = 2.0
  6364.         RETURN
  6365.         ELSE
  6366.         YA(1) = 0.0
  6367.     ENDIF
  6368. C
  6369. C    INITIALIZE THE LEXIDATA
  6370. C
  6371.     I = LX_INIT_START
  6372. 120    CONTINUE
  6373.     CALL LX_WRITE(LX_ERASE_INIT(I),LX_ERASE_INIT_WORDS+1-I)
  6374.     NXT = 1
  6375.     LX_BUFFER_STATUS = NO_VECTOR
  6376.     ICURRENT_COLOR = 1
  6377.     IX = 0
  6378.     IY = 0
  6379.     RETURN
  6380. C
  6381. C    **************************
  6382. C    GET FRESH PLOTTING SURFACE
  6383. C    **************************
  6384. C
  6385. 200    CONTINUE
  6386. C
  6387. C    ERASE THE LEXIDATA SCREEN AND RETURN TO NORMAL
  6388. C
  6389.     I = 1
  6390.     GO TO 120
  6391. C
  6392. C    *************
  6393. C    MOVE AND DRAW
  6394. C    *************
  6395. C
  6396. 300    CONTINUE
  6397.     IF ((LX_BUFFER_STATUS .EQ. NO_VECTOR) .OR.
  6398.     1   (NXT+2 .GE. LX_BUFFER_SIZE)) THEN
  6399.         IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6400.             CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6401.         ENDIF
  6402.         IF (NXT+32 .GE. LX_BUFFER_SIZE) THEN
  6403.             CALL LX_WRITE(BUFFER,NXT-1)
  6404.             NXT = 1
  6405.         ENDIF
  6406.         BUFFER(NXT) = LX_COMMAND_CVEC
  6407.         BUFFER(NXT+1) = ICURRENT_COLOR
  6408.         ICOUNT = NXT+2
  6409.         IX = IX .OR. "100000
  6410.         BUFFER(NXT+3) = IXEQ(1)
  6411.         BUFFER(NXT+4) = IY
  6412.         NXT = NXT + 5
  6413.         LX_BUFFER_STATUS = VECTOR_MOVE
  6414.     ENDIF
  6415. C
  6416. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  6417. C
  6418.     IX = XGUPCM*XA(1) + 0.5
  6419.     IY = MAXY - INT(YGUPCM*YA(1) + 0.5)
  6420.     IF (IFXN .EQ. 3) THEN
  6421.         IX = IX .OR. "100000
  6422.         IF (LX_BUFFER_STATUS .EQ. VECTOR_MOVE) NXT = NXT - 2
  6423.         LX_BUFFER_STATUS = VECTOR_MOVE
  6424.         ELSE
  6425.         LX_BUFFER_STATUS = VECTOR_DRAW
  6426.     ENDIF
  6427.     BUFFER(NXT) = IXEQ(1)
  6428.     BUFFER(NXT+1) = IY
  6429.     NXT = NXT + 2
  6430.     RETURN
  6431. C
  6432. C    *****************************
  6433. C    FLUSH GRAPHICS COMMAND BUFFER
  6434. C    *****************************
  6435. C
  6436. 500    CONTINUE
  6437.     IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6438.         CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6439.         LX_BUFFER_STATUS = NO_VECTOR
  6440.     ENDIF
  6441.     IF (NXT .GT. 1) CALL LX_WRITE(BUFFER,NXT-1)
  6442.     RETURN
  6443. C
  6444. C    ******************
  6445. C    RELEASE THE DEVICE
  6446. C    ******************
  6447. C
  6448. 600    CONTINUE
  6449. C
  6450. C    DE-ASSIGN THE CHANNALS
  6451. C
  6452.     ISTAT = SYS$DASSGN(%VAL(IOCHANTT))
  6453.     CALL LX_CLOSE
  6454.     RETURN
  6455. C
  6456. C    *****************************
  6457. C    RETURN DEVICE CHARACTERISTICS
  6458. C    *****************************
  6459. C
  6460. 700    CONTINUE
  6461.     DO 720 I=1,8
  6462.     XA(I) = DCHAR(I)
  6463. 720    CONTINUE
  6464.     RETURN
  6465. C
  6466. C    ****************************
  6467. C    SELECT CURRENT DRAWING COLOR
  6468. C    ****************************
  6469. C
  6470. 800    CONTINUE
  6471.     ICURRENT_COLOR = XA(1)
  6472.     IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6473.         CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6474.         LX_BUFFER_STATUS = NO_VECTOR
  6475.     ENDIF
  6476.     RETURN
  6477. C
  6478. C    **********************
  6479. C    PERFORM GRAPHICS INPUT
  6480. C    **********************
  6481. C
  6482. 900    CONTINUE
  6483.     IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6484.         CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6485.     ENDIF
  6486.     IF (NXT+LX_CURSOR_WORDS .GE. LX_BUFFER_SIZE) THEN
  6487.         CALL LX_WRITE(BUFFER,NXT-1)
  6488.         NXT = 1
  6489.     ENDIF
  6490.     DO 910 I=1,LX_CURSOR_WORDS
  6491.         BUFFER(NXT) = LX_CURSOR(I)
  6492.         NXT = NXT + 1
  6493. 910        CONTINUE
  6494.     CALL LX_WRITE(BUFFER,NXT-1)
  6495.     LX_BUFFER_STATUS = NO_VECTOR
  6496.     NXT = 1
  6497. C
  6498. C    ASK FOR 1 CHARACTER FROM THE TERMINAL
  6499. C
  6500.     ISTAT = SYS$QIOW(%VAL(0),%VAL(IOCHANTT),%VAL(IOREADNOECHO),
  6501.     1   IOSB, , ,CHARBUFR,%VAL(1), , , , )
  6502.     IF (.NOT. ISTAT) STOP 'GD9400 - GIN FAILURE'
  6503. C
  6504. C    TELL LEXIDATA TO DROP CROSS HAIR CURSOR AND TO READ
  6505. C     THE CURSOR POSITION
  6506. C
  6507.     CALL LX_WRITE(LX_READ_CURSOR,LX_READ_CURSOR_WORDS)
  6508.     CALL LX_READ(BUFFER,3)
  6509. D    TYPE *,'CURSOR LOCATION ',BUFFER(1), BUFFER(2)
  6510. C
  6511. C    GET THE KEY, X POSITION, AND Y POSITION
  6512. C
  6513.     XA(1) = CHARBUFR            !PICK CHARACTER
  6514.     XA(2) = FLOAT(BUFFER(1))/XGUPCM        !X IN CENTIMETERS.
  6515.     XA(3) = FLOAT(MAXY-BUFFER(2))/YGUPCM    !Y IN CM.
  6516.     RETURN
  6517. C
  6518. C    **************************
  6519. C    SET COLOR USING RGB VALUES
  6520. C    **************************
  6521. C
  6522. 1000    CONTINUE
  6523.     IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6524.         CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6525.     ENDIF
  6526.     IF (NXT+16 .GT. LX_BUFFER_SIZE) THEN
  6527.         CALL LX_WRITE(BUFFER,NXT-1)
  6528.         NXT = 1
  6529.     ENDIF
  6530.     LX_BUFFER_STATUS = NO_VECTOR
  6531.     ICOLOR = XA(1)
  6532.     DO 1010 I=1,3
  6533.         BUFFER(NXT) = LX_COMMAND_LOAD_LUT
  6534.         ICOLOR = ICOLOR + 1024
  6535.         BUFFER(NXT+1) = ICOLOR        !LUT ADDRESS
  6536.         BUFFER(NXT+2) = 1        !1 LUT ADDRESS TO LOAD
  6537.         BUFFER(NXT+3) = 2.55*YA(I)+0.5
  6538.         NXT = NXT + 4
  6539. 1010        CONTINUE
  6540. D    TYPE 9997, ICOLOR, (BUFFER(I), I=NXT-9,NXT-1,4)
  6541. D9997    FORMAT(' COLOR ',I4,' IS ',3(I4,2X))
  6542.     RETURN
  6543. C
  6544. C    ***************
  6545. C    CONVEX POLYGONS
  6546. C    ***************
  6547. C
  6548. 20000    CONTINUE
  6549.     NPTS = IFXN - 1024
  6550.     IF (LX_BUFFER_STATUS .NE. NO_VECTOR) THEN
  6551.         CALL GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6552.         LX_BUFFER_STATUS = NO_VECTOR
  6553.     ENDIF
  6554.     IF ((NXT+3+2*NPTS) .GE. LX_BUFFER_SIZE) THEN
  6555.         CALL LX_WRITE(BUFFER,NXT-1)
  6556.         NXT = 1
  6557.     ENDIF
  6558.     BUFFER(NXT) = LX_COMMAND_POLY
  6559.     BUFFER(NXT+1) = ICURRENT_COLOR
  6560.     BUFFER(NXT+2) = 2*NPTS
  6561.     NXT = NXT + 3
  6562.     DO 20010 I=1,NPTS
  6563.         BUFFER(NXT) = XGUPCM*XA(I) + 0.5
  6564.         BUFFER(NXT+1) = MAXY - INT(YGUPCM*YA(I)+0.5)
  6565.         NXT = NXT + 2
  6566. 20010        CONTINUE
  6567.     RETURN
  6568.     END
  6569.     SUBROUTINE GDLEX_TERM_VECT(BUFFER,ICOUNT,NXT)
  6570.     INTEGER*2 BUFFER(NXT)
  6571. C
  6572. C    THIS SUBROUTINE PROPERLY TERMINATES A CHAINED VECTOR SEQUENCE
  6573. C     BY CALCULATING THE WORD COUNT AND PLACING IT INTO THE BUFFER
  6574. C
  6575.     NWORDS = (NXT-ICOUNT) - 1
  6576.     IF (NWORDS .EQ. 0) THEN
  6577.         NXT = NXT - 3
  6578.         ELSE
  6579.         BUFFER(ICOUNT) = NWORDS
  6580. D        TYPE 9999, (BUFFER(I), I=ICOUNT-2,NXT-1)
  6581. D9999        FORMAT(//' Vector buffer is:',10000(/1X,I6))
  6582.     ENDIF
  6583.     RETURN
  6584.     END
  6585.     SUBROUTINE GDLXY11(IFXN,XA,YA)
  6586.     DIMENSION XA(8), YA(3)
  6587. C
  6588. C    DIGLIB LXY-11 GRAPHICS DEVICE DRIVER
  6589. C
  6590. C-----------------------------------------------------------------------
  6591. C
  6592.     DIMENSION DCHAR(8)
  6593.     LOGICAL*2 LDUMPIT, LWIDE
  6594. C
  6595. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  6596. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  6597. C
  6598.     EQUIVALENCE (DCHAR(2),X_FULL_SCALE)
  6599.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  6600.     DATA DCHAR /302.0, 21.59, 26.67, 78.7402, 78.7402, 1.0, 3.0, 1.0/
  6601.     SAVE LDUMPIT
  6602. C
  6603. C    SHOW WE WANT wide NOT tall PLOTTING AREA
  6604. C
  6605.     LWIDE = .TRUE.
  6606. 10    CONTINUE
  6607. C
  6608. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  6609. C
  6610.     IF (IFXN .LE. 0 .OR. IFXN .GT. 7) RETURN
  6611. C
  6612. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  6613. C
  6614.     GO TO (100,200,300,400,500,600,700) IFXN
  6615. C
  6616. C    *********************
  6617. C    INITIALIZE THE DEVICE
  6618. C    *********************
  6619. C
  6620. 100    CONTINUE
  6621.         FACT = 1.0                        ! ENLARGE   
  6622.         IS = 0                            ! SELEST POSTPROCESSING
  6623.         LU = XA(1)                        ! LU IS IGNORED, INCLUDED ANYWAY
  6624.     CALL PLOTST (1,'CM',IS)
  6625.     CALL FACTOR (FACT)
  6626.     LDUMPIT = .FALSE.
  6627.     YA(1) = 0.0
  6628.     RETURN
  6629. C
  6630. C    **************************
  6631. C    GET FRESH PLOTTING SURFACE
  6632. C    **************************
  6633. C
  6634. 200    CONTINUE
  6635.     IF (LDUMPIT) THEN
  6636.         CALL PLOT(0.0, 0.0, -3)
  6637. C        CALL FACTOR(1.0/2.54)
  6638.       ENDIF
  6639.     LDUMPIT = .FALSE.
  6640.     RETURN
  6641. C
  6642. C    ******************************
  6643. C    MOVE CURRENT REFERENCE POINTER
  6644. C    ******************************
  6645. C
  6646. 300    CONTINUE
  6647.     IPEN = +3
  6648.     GO TO 450
  6649. C
  6650. C    ****************************
  6651. C    DRAW VECTER TO POSITION X,Y
  6652. C    ****************************
  6653. C
  6654. 400    CONTINUE
  6655.     IPEN = +2
  6656. 450    IF (LWIDE) THEN
  6657.                     CALL PLOT(X_FULL_SCALE-YA(1), XA(1), IPEN)
  6658.            ELSE
  6659.                     CALL PLOT(XA(1), YA(1), IPEN)
  6660.         END IF
  6661. C
  6662.     LDUMPIT = .TRUE.
  6663.     RETURN
  6664. C
  6665. C    *****************************************************************
  6666. C    FLUSH GRAPHICS COMMAND BUFFER,CLOSE VECTOR FILE TO TERMINATE PLOT
  6667. C    *****************************************************************
  6668. C
  6669. 500    CONTINUE
  6670.         CALL PLOTND
  6671. C
  6672.     RETURN
  6673. C
  6674. C    ******************
  6675. C    RELEASE THE DEVICE
  6676. C    ******************
  6677. C
  6678. 600    CONTINUE
  6679.         ISTATUS = LIB$SPAWN(' $ RUN SYS$SYSTEM:PLXY')     !CREATE VECTOR FILE
  6680.         ISTATUS = LIB$SPAWN(' $ PRINT PLTDAT.PLT/NOFEED ') !PRINT OUTPUT FILE
  6681.     RETURN
  6682. C
  6683. C    *****************************
  6684. C    RETURN DEVICE CHARACTERISTICS
  6685. C    *****************************
  6686. C
  6687. 700    CONTINUE
  6688.     DO 720 I=1,8
  6689.     XA(I) = DCHAR(I)
  6690. 720    CONTINUE
  6691.     IF (.NOT. LWIDE) RETURN
  6692.     XA(2) = DCHAR(3)
  6693.     XA(3) = DCHAR(2)
  6694.     RETURN
  6695. C
  6696. C    ALTERNATE ENTRY FOR WIDE PLOTTING AREA
  6697. C
  6698.     ENTRY GDLXY11_tall(IFXN,XA,YA)
  6699.     LWIDE = .FALSE.
  6700.     GO TO 10
  6701.     END
  6702.     SUBROUTINE GDMCRO(IFXN,XA,YA)
  6703.     DIMENSION XA(8), YA(3)
  6704. C
  6705. C    MICROTERM ERGO 301 w/4010 graphics DRIVER FOR DIGLIB/VAX
  6706. C        1024 x 780 (4010 resolution) effective
  6707. C        hardware mapped to 768 x 245
  6708. C
  6709. C    Converted from Retro-Graphics driver by Andy Simmons.
  6710. C    Refinements by Hal R. Brand and R. A. Saroyan   Jan 85
  6711. C
  6712. C    GB_Empty puts the terminal to VT100 mode so interactive
  6713. C    graphics can be done. 
  6714. C    Must put the terminal into Plot-10 mode for each graphical
  6715. C    operation.
  6716. C
  6717. C    The fast method of sending drawing coordinates to the terminal
  6718. C    cannot be used (probably because of the switching in and out of
  6719. C    plot-10 mode). The slow method of sending coordinates is included
  6720. C    here as the subroutine GD_4010_Convert_Slo.
  6721. C
  6722. C-----------------------------------------------------------------------
  6723. C
  6724.     EXTERNAL LEN
  6725.     BYTE ESC, CSUB, TMODE, GS, CR, FF
  6726.     PARAMETER (ESC=27, CSUB=26, TMODE=24, GS=29, CR=13, FF=12)
  6727.     parameter (ENTNTV=49, ENTP10=42, EXP10=79, EXNTV=50, ENQ=5)
  6728.     CHARACTER*(*) TERMINAL
  6729.     PARAMETER (TERMINAL='TT')
  6730. C
  6731. C    DEFINITIONS FOR DEVICE CONTROL
  6732. C
  6733.     BYTE STR_BEGIN_PLOT1(6), STR_BEGIN_PLOT2(4)
  6734.     BYTE STR_ENTER_PLOT10(6), STR_EXIT_PLOT10(6)
  6735.     BYTE STR_END_PLOT(6)
  6736. C
  6737.     DATA STR_BEGIN_PLOT1 /ESC,'[','2','J',0,0/
  6738.     DATA STR_BEGIN_PLOT2 /ESC,FF,2*0/
  6739.     DATA STR_ENTER_PLOT10 /ESC,ENTNTV,ESC,ENTP10,2*0/
  6740.     DATA STR_EXIT_PLOT10 /ESC,EXP10,ESC,EXNTV,2*0/
  6741.     DATA STR_END_PLOT /ESC,'[','2','J',0,0/
  6742.     DATA LENGTH_END_PLOT /4/
  6743. C
  6744. C    DEFINITIONS FOR GIN
  6745. C
  6746. C    Enter Plot-10 mode and request GIN mode.
  6747. C
  6748.     BYTE GINBUFR(8), PROMPT(8)
  6749.     DATA prompt /ESC,ENTNTV,ESC,ENTP10,esc,csub,2*0/
  6750.     DATA IGIN_IN_CHARS /6/        !5 FROM 4010 GIN, PLUS CR
  6751. C
  6752. C    DECLARE BUFFERING FUNCTION
  6753. C
  6754.     LOGICAL GB_TEST_FLUSH
  6755. C
  6756. C    DECLARE VARS NEED FOR DRIVER OPERATION
  6757. C
  6758.     LOGICAL LVECTOR_GOING
  6759.     DIMENSION DCHAR(8)
  6760. C
  6761. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  6762. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  6763. C
  6764.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  6765.     DATA DCHAR /100.0, 21.001, 15.747, 30.419, 30.419, 1.0, 133.0, 1.0/
  6766. C
  6767. C*****************
  6768. C
  6769. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  6770. C
  6771.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  6772. C
  6773. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  6774. C
  6775.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  6776. C
  6777. C    *********************
  6778. C    INITIALIZE THE DEVICE
  6779. C    *********************
  6780. C
  6781. 100    CONTINUE
  6782. C
  6783. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  6784. C
  6785.     CALL GB_INITIALIZE(CR,STR_EXIT_PLOT10,TERMINAL,IERR)
  6786.     YA(1) = IERR
  6787.     LVECTOR_GOING = .FALSE.
  6788.     RETURN
  6789. C
  6790. C    **************************
  6791. C    GET FRESH PLOTTING SURFACE
  6792. C    **************************
  6793. C
  6794. 200    CONTINUE
  6795.     CALL GB_EMPTY
  6796.     CALL GB_IN_STRING(STR_BEGIN_PLOT1)
  6797.     CALL GB_IN_STRING(STR_ENTER_PLOT10)
  6798.     CALL GB_IN_STRING(STR_BEGIN_PLOT2)
  6799.     CALL GB_EMPTY
  6800.     LVECTOR_GOING = .FALSE.
  6801.     RETURN
  6802. C
  6803. C    ****
  6804. C    MOVE
  6805. C    ****
  6806. C
  6807. 300    CONTINUE
  6808. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  6809.     IXPOSN = XGUPCM*XA(1)+0.5
  6810.     IYPOSN = YGUPCM*YA(1)+0.5
  6811.     LVECTOR_GOING = .FALSE.
  6812.     RETURN
  6813. C
  6814. C    ****
  6815. C    DRAW
  6816. C    ****
  6817. C
  6818. 400    CONTINUE
  6819.     IX = XGUPCM*XA(1)+0.5
  6820.     IY = YGUPCM*YA(1)+0.5
  6821. C
  6822. C    MAKE SURE BUFFER SPACE AVAILABLE AND IN GRAPHICS MODE
  6823. C
  6824.     IF (LVECTOR_GOING) THEN
  6825.         IF (GB_TEST_FLUSH(4)) THEN
  6826.             CALL GB_IN_STRING(STR_ENTER_PLOT10)
  6827.             LVECTOR_GOING = .FALSE.
  6828.         ENDIF
  6829.         ELSE
  6830.         CALL GB_TEST_FLUSH(20)
  6831.         CALL GB_IN_STRING(STR_ENTER_PLOT10)
  6832.         LVECTOR_GOING = .FALSE.
  6833.     ENDIF
  6834.     IF (LVECTOR_GOING) GO TO 410
  6835.     LVECTOR_GOING = .TRUE.
  6836.     CALL GB_INSERT(GS)
  6837.     CALL GB_USE_TERMINATOR
  6838.     CALL GD_4010_Convert_Slo((8*IXPOSN/5),(13*IYPOSN)/8)
  6839. 410    CALL GD_4010_Convert_Slo((8*IX/5),(13*IY)/8)
  6840.     IXPOSN = IX
  6841.     IYPOSN = IY
  6842.     RETURN
  6843. C
  6844. C    *****************************
  6845. C    FLUSH GRAPHICS COMMAND BUFFER
  6846. C    *****************************
  6847. C
  6848. 500    CONTINUE
  6849.     CALL GB_EMPTY
  6850.     LVECTOR_GOING = .FALSE.
  6851.     CALL GB_SEND_CHARS(STR_END_PLOT,LENGTH_END_PLOT)
  6852.     RETURN
  6853. C
  6854. C    ******************
  6855. C    RELEASE THE DEVICE
  6856. C    ******************
  6857. C
  6858. 600    CONTINUE
  6859. C
  6860. C    DE-ASSIGN THE CHANNAL
  6861. C
  6862.     CALL GB_FINISH(0)
  6863.     RETURN
  6864. C
  6865. C    *****************************
  6866. C    RETURN DEVICE CHARACTERISTICS
  6867. C    *****************************
  6868. C
  6869. 700    CONTINUE
  6870.     DO 720 I=1,8
  6871.     XA(I) = DCHAR(I)
  6872. 720    CONTINUE
  6873.     RETURN
  6874. C
  6875. C    ****************************
  6876. C    SELECT CURRENT DRAWING COLOR
  6877. C    ****************************
  6878. C
  6879.  800    CONTINUE
  6880. c    LDUMMY = GB_TEST_FLUSH(8)
  6881. c    ICOLOR = XA(1)
  6882. c    IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  6883. c    ICOLOR = 1-ICOLOR        !CONVERT 1 TO 0 AND 0 INTO 1
  6884. c    STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER 0 OR 1
  6885. c    CALL GB_IN_STRING(STR_COLOR_SET)
  6886. c    CALL GB_USE_TERMINATOR
  6887. c    LVECTOR_GOING = .FALSE.
  6888.     RETURN
  6889. C
  6890. C    **********************
  6891. C    PERFORM GRAPHICS INPUT
  6892. C    **********************
  6893. C
  6894.  900    CONTINUE
  6895.     CALL GB_EMPTY
  6896.     LVECTOR_GOING = .FALSE.
  6897. C
  6898.     CALL GB_EMPTY
  6899.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  6900.     CALL GB_INSERT(CR)
  6901.     CALL GB_EMPTY
  6902. C
  6903.     ICHAR = GINBUFR(1)
  6904.     IX1 = GINBUFR(2)
  6905.     IX2 = GINBUFR(3)
  6906.     IY1 = GINBUFR(4)
  6907.     IY2 = GINBUFR(5)
  6908. C
  6909.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  6910.     XA(2) = (5.0*(32*IAND(IX1,31)+IAND(IX2,31))/8.0)/XGUPCM
  6911.     XA(3) = (8.0*(32*IAND(IY1,31)+IAND(IY2,31))/13.0)/YGUPCM
  6912. C
  6913.     RETURN
  6914.     END
  6915.  
  6916.  
  6917.     SUBROUTINE GD_4010_Convert_SLO(IX,IY)
  6918. C
  6919. C    THIS SUBROUTINE CONVERTS THE POINT (IX,IY) INTO THE 4010 SCHEME
  6920. C    OF ENCODING COORDINATES
  6921. C
  6922.     CALL GB_INSERT(32+IY/32)
  6923.     CALL GB_INSERT(96+IAND(IY,31))
  6924.     CALL GB_INSERT(32+IX/32)
  6925.     CALL GB_INSERT(64+IAND(IX,31))
  6926.  
  6927.     RETURN
  6928.     END
  6929.     SUBROUTINE GDPOSTSCR_TALL(IFXN,XA,YA)
  6930.     DIMENSION XA(8), YA(3)
  6931. C
  6932. C    POST SCRIPT DRIVER - HARD COPY DEVICE HAS 300 DOTS/INCH
  6933.     PARAMETER (DOTS_PER_INCH = 300.0)
  6934. C
  6935. C-----------------------------------------------------------------------
  6936. C
  6937. C    DECLARE VARS NEED FOR DRIVER OPERATION
  6938. C
  6939.     LOGICAL*1 L_NOTHING_PLOTTED, L_WIDE
  6940.     BYTE COORD(20)
  6941.     CHARACTER*8 CTIME
  6942.     CHARACTER*80 FILENAME
  6943.     CHARACTER*120 COMMAND
  6944. C
  6945.     DIMENSION DCHAR(8)
  6946. C
  6947. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  6948. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  6949. C
  6950.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  6951. C
  6952. C    PAPER DEFINITIONS (INCHES)
  6953. C
  6954.     PARAMETER (PSRES = 72.0)
  6955.     REAL*4 LEFT_MARGIN
  6956.     PARAMETER (LEFT_MARGIN = 0.5)
  6957.     PARAMETER (RIGHT_MARGIN = 0.25)
  6958.     PARAMETER (TOP_MARGIN = 0.5)
  6959.     PARAMETER (BOTTOM_MARGIN = 0.25)
  6960.     PARAMETER (PAPER_HEIGHT = 11.0)
  6961.     PARAMETER (PAPER_WIDTH = 8.5)
  6962. C        DERIVED PARAMETERS
  6963.     PARAMETER (USEABLE_WIDTH = PAPER_WIDTH-LEFT_MARGIN-RIGHT_MARGIN)
  6964.     PARAMETER (USEABLE_HEIGHT = PAPER_HEIGHT-TOP_MARGIN-BOTTOM_MARGIN)
  6965.     PARAMETER (WIDTH_CM = 2.54*USEABLE_WIDTH)
  6966.     PARAMETER (HEIGHT_CM = 2.54*USEABLE_HEIGHT)
  6967.     PARAMETER (RESOLUTION = DOTS_PER_INCH/2.54)
  6968.     PARAMETER (PSRESCM = PSRES/2.54)
  6969.     PARAMETER (XOFF = PSRES*LEFT_MARGIN)
  6970.     PARAMETER (YOFF = PSRES*BOTTOM_MARGIN)
  6971. C
  6972.     PARAMETER (MAX_POINTS_PER_PATH = 900)
  6973. C
  6974. C    DIGLIB DEVICE CHARACTERISTICS WORDS
  6975. C
  6976.     DATA DCHAR /910.0, WIDTH_CM, HEIGHT_CM, RESOLUTION,
  6977.     1   RESOLUTION, 1.0, 27.0, 4.0/
  6978. C
  6979.     BYTE EOF(2)
  6980.     DATA EOF /4,0/
  6981. C
  6982.     L_WIDE = .FALSE.
  6983. 10    CONTINUE
  6984. C
  6985. C*****************
  6986. C
  6987. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  6988. C
  6989.     IF (IFXN .LE. 0 .OR. IFXN .GT. 7) RETURN
  6990. C
  6991. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  6992. C
  6993.     GO TO (100,200,300,400,500,600,700) IFXN
  6994. C
  6995. C    *********************
  6996. C    INITIALIZE THE DEVICE
  6997. C    *********************
  6998. C
  6999. 100    CONTINUE
  7000.     LUN = XA(1)
  7001.     CALL IDATE(IM,ID,IY)
  7002.     CALL TIME(CTIME)
  7003.     FILENAME = 'SYS$SCRATCH:POSTSCRIPT.DIG'//CHAR(IM+64)//CHAR(ID+64)
  7004.     1   //CTIME(1:2)//CTIME(4:5)//CTIME(7:8)
  7005.     OPEN (UNIT=LUN,NAME=FILENAME,TYPE='NEW',
  7006.     1   FORM='UNFORMATTED',CARRIAGECONTROL='NONE',RECORDTYPE='VARIABLE',
  7007.     2   INITIALSIZE = 50, EXTENDSIZE = 50, ERR=9000)
  7008. C
  7009. C    SHOW INITIALIZATION WORKED, I.E. WE OPENED THE FILE.
  7010. C
  7011.     YA(1) = 0.0
  7012.     CALL GDLSR_OPEN_BUFR(LUN)
  7013.     CALL GDLSR_INSERT(EOF)
  7014.     CALL GDLSR_INSERT('erasepage initgraphics 1 setlinecap 1 setlinejoin ')
  7015.     CALL GDLSR_INSERT('/m {moveto} def /l {lineto} def ')
  7016.     CALL GDLSR_DUMP_BUFR
  7017. 190    CONTINUE
  7018.     L_NOTHING_PLOTTED = .TRUE.
  7019.     N_POINTS_IN_PATH = 0
  7020.     RETURN
  7021. C
  7022. C    **************************
  7023. C    GET FRESH PLOTTING SURFACE
  7024. C    **************************
  7025. C
  7026. 200    CONTINUE
  7027.     IF (.NOT. L_NOTHING_PLOTTED) THEN
  7028.         CALL GDLSR_INSERT('stroke showpage ')
  7029.     ENDIF
  7030.     CALL GDLSR_INSERT('newpath ')
  7031.     GO TO 190
  7032. C
  7033. C    ****
  7034. C    MOVE
  7035. C    ****
  7036. C
  7037. 300    CONTINUE
  7038. C
  7039. C    ****
  7040. C    DRAW
  7041. C    ****
  7042. C
  7043. 400    CONTINUE
  7044.     N_POINTS_IN_PATH = N_POINTS_IN_PATH + 1
  7045.     IF (N_POINTS_IN_PATH .GT. MAX_POINTS_PER_PATH) THEN
  7046.         CALL GDLSR_INSERT('stroke newpath ')
  7047.         IF (IFXN .EQ. 4) THEN
  7048.             CALL GDLSR_INSERT(COORD)
  7049.             CALL GDLSR_INSERT('m ')
  7050.         ENDIF
  7051.         N_POINTS_IN_PATH = 1
  7052.     ENDIF
  7053.     IF (L_WIDE) THEN
  7054.         X = PSRESCM*YA(1)+XOFF
  7055.         Y = PSRESCM*(HEIGHT_CM-XA(1))+YOFF
  7056.         ELSE
  7057.         X = PSRESCM*XA(1)+XOFF
  7058.         Y = PSRESCM*YA(1)+YOFF
  7059.     ENDIF
  7060.     ENCODE (14,451,COORD) X,Y
  7061. 451    FORMAT(F6.1,1X,F6.1,1X)
  7062.     COORD(15) = 0
  7063.     CALL GDLSR_INSERT(COORD)
  7064.     IF (IFXN .EQ. 3) THEN
  7065.         CALL GDLSR_INSERT('m ')
  7066.         ELSE
  7067.         CALL GDLSR_INSERT('l ')
  7068.     ENDIF
  7069.     L_NOTHING_PLOTTED = .FALSE.
  7070.     RETURN
  7071. C
  7072. C    *****************************
  7073. C    FLUSH GRAPHICS COMMAND BUFFER
  7074. C    *****************************
  7075. C
  7076. 500    CONTINUE
  7077.     RETURN        !DONE BY BGNPLT WHEN NECESSARY.
  7078. C
  7079. C    ******************
  7080. C    RELEASE THE DEVICE
  7081. C    ******************
  7082. C
  7083. 600    CONTINUE
  7084.     IF (.NOT. L_NOTHING_PLOTTED) THEN
  7085.         CALL GDLSR_INSERT('stroke showpage ')
  7086.         CALL GDLSR_INSERT(EOF)
  7087.         CALL GDLSR_DUMP_BUFR
  7088.     ENDIF
  7089.     CLOSE (UNIT=LUN)
  7090.     COMMAND = '$ PROCESSPS '//FILENAME
  7091.     ISTATUS = LIB$SPAWN(COMMAND, , ,1)
  7092.     RETURN
  7093. C
  7094. C    *****************************
  7095. C    RETURN DEVICE CHARACTERISTICS
  7096. C    *****************************
  7097. C
  7098. 700    CONTINUE
  7099.     DO 720 I=1,8
  7100.     XA(I) = DCHAR(I)
  7101. 720    CONTINUE
  7102.     IF (L_WIDE) THEN
  7103.         XA(2) = DCHAR(3)
  7104.         XA(3) = DCHAR(2)
  7105.     ENDIF
  7106.     RETURN
  7107. C
  7108. C    HANDLE FILE OPEN ERROR
  7109. C
  7110. 9000    CONTINUE
  7111.     YA(1) = 3.0
  7112.     RETURN
  7113. C
  7114. C    ***********************************************************
  7115. C
  7116.     ENTRY GDPOSTSCR_WIDE(IFXN,XA,YA)
  7117.     L_WIDE = .TRUE.
  7118.     GO TO 10
  7119.     END
  7120.  
  7121.  
  7122.     SUBROUTINE GDLSR_OPEN_BUFR(LUN)
  7123. C
  7124.     PARAMETER (IBUFR_SIZE = 80)
  7125.     BYTE BUFFER
  7126.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  7127. C
  7128.     LUNOUT = LUN
  7129.     NXTCHR = 1
  7130.     RETURN
  7131.     END
  7132.  
  7133.  
  7134.     SUBROUTINE GDLSR_INIT_BUFR
  7135. C
  7136.     PARAMETER (IBUFR_SIZE = 80)
  7137.     BYTE BUFFER
  7138.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  7139. C
  7140.     NXTCHR = 1
  7141.     RETURN
  7142.     END
  7143.  
  7144.  
  7145.     SUBROUTINE GDLSR_INSERT(STRING)
  7146.     BYTE STRING(2)
  7147. C
  7148.     PARAMETER (IBUFR_SIZE = 80)
  7149.     BYTE BUFFER
  7150.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  7151. C
  7152.     EXTERNAL LEN
  7153. C
  7154.     L = LEN(STRING)
  7155.     IF ((NXTCHR+L) .GT. IBUFR_SIZE) CALL GDLSR_DUMP_BUFR
  7156.         DO 100 I = 1, L
  7157.         BUFFER(NXTCHR) = STRING(I)
  7158.         NXTCHR = NXTCHR + 1
  7159. 100        CONTINUE
  7160.     RETURN
  7161.     END
  7162.  
  7163.     SUBROUTINE GDLSR_DUMP_BUFR
  7164. C
  7165.     PARAMETER (IBUFR_SIZE = 80)
  7166.     BYTE CR
  7167.     PARAMETER (CR = 13)
  7168.     BYTE BUFFER
  7169.     COMMON /GDLSR/ NXTCHR, LUNOUT, BUFFER(IBUFR_SIZE)
  7170. C
  7171.     IF (NXTCHR .EQ. 1) RETURN
  7172.     WRITE (LUNOUT) (BUFFER(I), I=1,NXTCHR-1), CR
  7173.     NXTCHR = 1
  7174.     RETURN
  7175.     END
  7176.     SUBROUTINE GDRASTECH(IFXN,XA,YA)
  7177. C
  7178. C    RASTER TECHNOLOGIES MODEL ONE DIGLIB DRIVER 9/4/85
  7179. C    ( 512 X 512 RESOLUTION )
  7180. C
  7181. C    JOHN C PETERSON
  7182. C    TRW/MED INC. MS RC2/2639
  7183. C    ONE RANCHO CARMEL
  7184. C    SAN DIEGO, CA 92128
  7185. C
  7186.     DIMENSION XA(1),YA(1)
  7187. C
  7188. C    VARIABLE DECLARATIONS FOR DEVICE CONTROL
  7189. C
  7190.     CHARACTER*(*) TERMINAL
  7191.     PARAMETER ( TERMINAL='TT' )
  7192. C
  7193.     BYTE STR_GRAPHICS_MODE(1)
  7194.     BYTE STR_COLD_START(1)
  7195.     BYTE STR_INIT_DEV(32)
  7196.     BYTE STR_BEGIN_PLOT(10)
  7197.     BYTE STR_MOVE(1)
  7198.     BYTE STR_DRAW(1)
  7199.     BYTE STR_SET_COLOR(1)
  7200.     BYTE STR_POLY(2)
  7201.     BYTE STR_XHAIR(3)
  7202.     BYTE STR_PROMPT(2)
  7203.     BYTE STR_FLUSH(1)
  7204.     BYTE STR_READ_BUTTON(3)
  7205.     BYTE STR_READ_REGISTER(2)
  7206.     BYTE STR_GIN_BUFFER(16)
  7207.     BYTE STR_ACKNOWLEDGE(1)
  7208.     BYTE STR_END_PLOT(1)
  7209.     BYTE STR_DEBUG(5)
  7210.     BYTE STR_END(2)
  7211. C
  7212. C    DATA LOAD DEVICE CONTROL VARIABLES
  7213. C
  7214.     DATA STR_GRAPHICS_MODE /'84'X /            !ENTER GRAPHICS MODE
  7215.     DATA STR_COLD_START /    'FD'X /            !COLD START
  7216.     DATA STR_INIT_DEV /    '84'X,            !ENTER GRAPHICS MODE
  7217.     1            '37'X,            !RESET COORDINATE ORIGIN
  7218.     2            0,0,0,0,        !HIX,LOX,HIY,LOY BYTES
  7219.     3            '36'X,            !RESET SCREEN ORIGIN
  7220.     4            0,0,0,0,        !HIX,LOX,HIY,LOY BYTES
  7221.     5            '3A'X,            !RESET WINDOW
  7222.     6            0,0,0,0,        !HIX,LOX,HIY,LOY BYTES
  7223.     7            0,0,0,0,        !HIX,LOX,HIY,LOY BYTES
  7224.     8            '1F'X,1,        !POLYGONS ARE FILLED
  7225.     9            '8B'X,0,        !DEFINE MACRO TO MAKE
  7226.     1            'A1'X,5,2,        ! THE CROSS HAIR FOLLOW
  7227.     2            '0C'X,            ! THE DIGITIZER MOUSE
  7228.     3            'AA'X,0,0,        !EXECUTE 1/30 SEC INT
  7229.     4            'FF'X /            !EXIT GRAPHICS MODE
  7230.     DATA STR_BEGIN_PLOT /    '84'X,
  7231.     1            '06'X,            !SET PIXEL VALUES
  7232.     2            0,0,0,            !RED, GREEN, BLUE
  7233.     3            '07'X,            !FLOOD THE SCREEN
  7234.     4            '06'X,            !SET PIXEL VALUES
  7235.     5            255,255,255 /        !RED, GREEN, BLUE
  7236.     DATA STR_MOVE /        '01'X /            !MOVE ABSOLUTE CODE
  7237.     DATA STR_DRAW /        '81'X /            !DRAW ABSOLUTE CODE
  7238.     DATA STR_SET_COLOR /    '06'X /            !SET PIXEL VALUES
  7239.     DATA STR_POLY /        '12'X,1 /        !DRAW ONE POLYGON CODE
  7240.     DATA STR_XHAIR /    '9C'X,0,0 /        !CURSOR VISIBILITY CODE
  7241.     DATA STR_PROMPT /    '?',0 /            !PROMPT USER FOR PICK
  7242.     DATA STR_FLUSH /    '15'X /            !EMPTY BUTTON QUEUE
  7243.     DATA STR_READ_REGISTER /'98'X,2 /        !READ TABLET REGISTER
  7244.     DATA STR_READ_BUTTON /    '9A'X,1,1 /        !READ MOUSE BUTTON VALUE
  7245.     DATA STR_ACKNOWLEDGE /    '86'X /            !ACKNOWLEDGE RECEPTION
  7246.     DATA STR_END_PLOT /    'FF'X /            !EXIT GRAPHICS MODE
  7247.     DATA STR_DEBUG /    '84'X,'A8'X,1,'FF'X,0 /    !******DEBUG MODE******
  7248.     DATA STR_END /        0,0 /
  7249. C
  7250. C    INTEGER*2 COORDINATE VARIABLES
  7251. C
  7252.     INTEGER*2 ICORORG,ISCRORG,IWINDOW
  7253. C
  7254.     DATA ICORORG /-256 /    !THESE VALUES DEPENDENT ON RESOLUTION
  7255.     DATA ISCRORG / 256 /
  7256.     DATA IWINDOW / 511 /
  7257. C
  7258.     INTEGER*2 IXMOVE,IYMOVE,IXDRAW,IYDRAW
  7259.     INTEGER*2 IXCURP,IYCURP,IXVERT,IYVERT
  7260. C
  7261.     BYTE STR_CORORG(2)
  7262.     BYTE STR_SCRORG(2)
  7263.     BYTE STR_WINDOW(2)
  7264.     BYTE STR_XMOVE(2)
  7265.     BYTE STR_YMOVE(2)
  7266.     BYTE STR_XDRAW(2)
  7267.     BYTE STR_YDRAW(2)
  7268.     BYTE STR_NVERT(2)
  7269.     BYTE STR_XVERT(2)
  7270.     BYTE STR_YVERT(2)
  7271. C
  7272. C    COLOR MAP TABLE
  7273. C
  7274.     BYTE COLOR_MAP(3,0:7)
  7275. C
  7276.     DATA COLOR_MAP /  0,  0,  0,    !BLACK
  7277.     1        255,255,255,    !WHITE
  7278.     2        255,  0,  0,    !RED
  7279.     3          0,255,  0,    !GREEN
  7280.     4          0,  0,255,    !BLUE
  7281.     5        255,255,  0,    !YELLOW
  7282.     6        255,  0,255,    !MAGENTA
  7283.     7          0,255,255 /    !CYAN
  7284. C
  7285. C    VARIABLE TO RECIEVE USER "PICK" CHARACTER
  7286. C
  7287.     BYTE IPICK
  7288. C
  7289. C    DECLARE FUNCTIONS AND VARIABLES NEED FOR DRIVER OPERATION
  7290. C
  7291.     LOGICAL GB_TEST_FLUSH,LVECTOR_DRAWING,LDUMMY
  7292. C
  7293. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  7294. C    ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  7295. C    ("YGUPCM" IS Y GRAPHICS UNITS PER CENTIMETER)
  7296. C
  7297.     DIMENSION DCHAR(8)
  7298. C
  7299.     EQUIVALENCE (DCHAR(4),XGUPCM)
  7300.     EQUIVALENCE (DCHAR(5),YGUPCM)
  7301. C
  7302.     DATA DCHAR /    9999.0,        !DIGLIB DEVICE NUMBER
  7303.     1        32.803, 26.232,    !X,Y SCREEN DIMENSIONS (CM)
  7304.     2        15.608, 19.518,    !XGUPCM, YGUPCM
  7305.     3        7.0,        !NUMBER OF FOREGROUND COLORS
  7306.     4        1411.0,        !DEVICE CHARACTERISTICS MASK
  7307.     5        1.0 /        !NUMBER OF SCAN LINES TO SKIP
  7308. C
  7309. C    *********************
  7310. C
  7311. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  7312. C
  7313.     IF (IFXN.GT.1024) GOTO 1300
  7314. C
  7315.     IF (IFXN.LE.0.OR.IFXN.GT.12) RETURN
  7316. C
  7317. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  7318. C
  7319.     GO TO (100,200,300,400,500,600,700,800,900,1000,1100,1200) IFXN
  7320. C
  7321. C    *********************
  7322. C    INITIALIZE THE DEVICE
  7323. C    *********************
  7324. C
  7325. 100    CONTINUE
  7326. C
  7327. C    FIRST INITIALIZE THE DIGLIB BUFFER SUBROUTINES
  7328. C
  7329.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  7330.     YA(1)= IERR
  7331.     IF (IERR.NE.0) RETURN
  7332. C
  7333. C    NOW COLD START THE MODEL ONE
  7334. C
  7335.     CALL GB_INSERT(STR_GRAPHICS_MODE(1))
  7336.     CALL GB_INSERT(STR_COLD_START(1))
  7337.     CALL GB_EMPTY
  7338. C
  7339. C    WAIT 10 SECONDS FOR COLD START TO COMPLETE BEFORE GOING ON
  7340. C
  7341.     CALL GDWAIT(10000)
  7342. C
  7343. C    FINISH WITH INITIALIZATION
  7344. C
  7345.     CALL RASTER_TECH_CONVERT(ICORORG,STR_CORORG)
  7346.     STR_INIT_DEV( 3)= STR_CORORG(1)
  7347.     STR_INIT_DEV( 4)= STR_CORORG(2)
  7348.     STR_INIT_DEV( 5)= STR_CORORG(1)
  7349.     STR_INIT_DEV( 6)= STR_CORORG(2)
  7350. C
  7351.     CALL RASTER_TECH_CONVERT(ISCRORG,STR_SCRORG)
  7352.     STR_INIT_DEV( 8)= STR_SCRORG(1)
  7353.     STR_INIT_DEV( 9)= STR_SCRORG(2)
  7354.     STR_INIT_DEV(10)= STR_SCRORG(1)
  7355.     STR_INIT_DEV(11)= STR_SCRORG(2)
  7356. C
  7357.     CALL RASTER_TECH_CONVERT(IWINDOW,STR_WINDOW)
  7358.     STR_INIT_DEV(17)= STR_WINDOW(1)
  7359.     STR_INIT_DEV(18)= STR_WINDOW(2)
  7360.     STR_INIT_DEV(19)= STR_WINDOW(1)
  7361.     STR_INIT_DEV(20)= STR_WINDOW(2)
  7362. C
  7363. C    CALL GB_IN_STRING(STR_DEBUG)    !******DEBUG******
  7364. C    CALL GB_EMPTY            !******DEBUG******
  7365. C
  7366.     DO N= 1,32
  7367.       CALL GB_INSERT(STR_INIT_DEV(N))
  7368.     ENDDO
  7369. C
  7370.     IXMOVE= 0
  7371.     IYMOVE= 0
  7372.     CALL RASTER_TECH_CONVERT(IXMOVE,STR_XMOVE)
  7373.     CALL RASTER_TECH_CONVERT(IYMOVE,STR_YMOVE)
  7374.     CALL GB_INSERT(STR_XMOVE(1))
  7375.     CALL GB_INSERT(STR_XMOVE(2))
  7376.     CALL GB_INSERT(STR_YMOVE(1))
  7377.     CALL GB_INSERT(STR_YMOVE(2))
  7378.     LVECTOR_DRAWING= .FALSE.
  7379.     IXCURP= IXMOVE
  7380.     IYCURP= IYMOVE
  7381. C
  7382.     CALL GB_EMPTY
  7383. C
  7384.     RETURN
  7385. C
  7386. C    **************************
  7387. C    GET FRESH PLOTTING SURFACE
  7388. C    **************************
  7389. C
  7390. 200    CONTINUE
  7391. C
  7392.     CALL GB_NEW_BUFFER
  7393. C
  7394.     DO N= 1,10
  7395.       CALL GB_INSERT(STR_BEGIN_PLOT(N))
  7396.     ENDDO
  7397. C
  7398.     IXMOVE= 0
  7399.     IYMOVE= 0
  7400.     CALL RASTER_TECH_CONVERT(IXMOVE,STR_XMOVE)
  7401.     CALL RASTER_TECH_CONVERT(IYMOVE,STR_YMOVE)
  7402.     CALL GB_INSERT(STR_XMOVE(1))
  7403.     CALL GB_INSERT(STR_XMOVE(2))
  7404.     CALL GB_INSERT(STR_YMOVE(1))
  7405.     CALL GB_INSERT(STR_YMOVE(2))
  7406.     LVECTOR_DRAWING= .FALSE.
  7407.     IXCURP= IXMOVE
  7408.     IYCURP= IYMOVE
  7409. C
  7410.     CALL GB_EMPTY
  7411. C
  7412.     RETURN
  7413. C
  7414. C    ****
  7415. C    MOVE
  7416. C    ****
  7417. C
  7418. 300    CONTINUE
  7419.     IXMOVE= XGUPCM*XA(1)+0.5
  7420.     IYMOVE= YGUPCM*YA(1)+0.5
  7421.     LVECTOR_DRAWING= .FALSE.
  7422.     RETURN
  7423. C
  7424. C    ****
  7425. C    DRAW
  7426. C    ****
  7427. C
  7428. 400    CONTINUE
  7429.     IXDRAW= XGUPCM*XA(1)+0.5
  7430.     IYDRAW= YGUPCM*YA(1)+0.5
  7431.     IF (LVECTOR_DRAWING) GO TO 450
  7432.     LDUMMY= GB_TEST_FLUSH(5)
  7433.     CALL GB_INSERT(STR_MOVE)
  7434.     CALL RASTER_TECH_CONVERT(IXMOVE,STR_XMOVE)
  7435.     CALL RASTER_TECH_CONVERT(IYMOVE,STR_YMOVE)
  7436.     CALL GB_INSERT(STR_XMOVE(1))
  7437.     CALL GB_INSERT(STR_XMOVE(2))
  7438.     CALL GB_INSERT(STR_YMOVE(1))
  7439.     CALL GB_INSERT(STR_YMOVE(2))
  7440.     LVECTOR_DRAWING= .TRUE.
  7441. C
  7442. 450    CONTINUE
  7443.     LDUMMY= GB_TEST_FLUSH(5)
  7444.     CALL GB_INSERT(STR_DRAW)
  7445.     CALL RASTER_TECH_CONVERT(IXDRAW,STR_XDRAW)
  7446.     CALL RASTER_TECH_CONVERT(IYDRAW,STR_YDRAW)
  7447.     CALL GB_INSERT(STR_XDRAW(1))
  7448.     CALL GB_INSERT(STR_XDRAW(2))
  7449.     CALL GB_INSERT(STR_YDRAW(1))
  7450.     CALL GB_INSERT(STR_YDRAW(2))
  7451.     IXMOVE= IXDRAW
  7452.     IYMOVE= IYDRAW
  7453.     IXCURP= IXDRAW
  7454.     IYCURP= IYDRAW
  7455.     RETURN
  7456. C
  7457. C    *****************************
  7458. C    FLUSH GRAPHICS COMMAND BUFFER
  7459. C    *****************************
  7460. C
  7461. 500    CONTINUE
  7462.     LVECTOR_DRAWING= .FALSE.
  7463.     LDUMMY= GB_TEST_FLUSH(1)
  7464.     CALL GB_INSERT(STR_END_PLOT(1))
  7465.     CALL GB_EMPTY
  7466.     RETURN
  7467. C
  7468. C    ******************
  7469. C    RELEASE THE DEVICE
  7470. C    ******************
  7471. C
  7472. 600    CONTINUE
  7473.     CALL GB_FINISH(STR_END)
  7474.     RETURN
  7475. C
  7476. C    *****************************
  7477. C    RETURN DEVICE CHARACTERISTICS
  7478. C    *****************************
  7479. C
  7480. 700    CONTINUE
  7481.     DO 750 I= 1,8
  7482.       XA(I)= DCHAR(I)
  7483. 750    CONTINUE
  7484.     RETURN
  7485. C
  7486. C    ****************************
  7487. C    SELECT CURRENT DRAWING COLOR
  7488. C    ****************************
  7489. C
  7490. 800    CONTINUE
  7491.     ICOLOR= IFIX( XA(1) )
  7492.     IF (ICOLOR.LT.0 .OR. ICOLOR.GT.7) RETURN
  7493. C
  7494.     LDUMMY= GB_TEST_FLUSH(4)
  7495.     CALL GB_INSERT(STR_SET_COLOR(1))
  7496.     CALL GB_INSERT(COLOR_MAP(1,ICOLOR))
  7497.     CALL GB_INSERT(COLOR_MAP(2,ICOLOR))
  7498.     CALL GB_INSERT(COLOR_MAP(3,ICOLOR))
  7499.     RETURN
  7500. C
  7501. C    ******************************************
  7502. C    PERFORM GRAPHICS INPUT WITH PICK CHARACTER
  7503. C    ******************************************
  7504. C
  7505. 900    CONTINUE
  7506. C
  7507.     STR_XHAIR(3)= 1
  7508.     LDUMMY= GB_TEST_FLUSH(4)
  7509.     CALL GB_INSERT(STR_XHAIR(1))        !MAKE CURSOR VISIBLE
  7510.     CALL GB_INSERT(STR_XHAIR(2))
  7511.     CALL GB_INSERT(STR_XHAIR(3))
  7512.     CALL GB_INSERT(STR_END_PLOT(1))        !GET READY FOR PICK CHARACTER
  7513.     CALL GB_EMPTY
  7514. C
  7515.     CALL GB_GIN(STR_PROMPT,1,.TRUE.,IPICK)
  7516. C
  7517.     LDUMMY= GB_TEST_FLUSH(3)
  7518.     CALL GB_INSERT(STR_GRAPHICS_MODE(1))
  7519.     CALL GB_INSERT(STR_READ_REGISTER(1))
  7520.     CALL GB_INSERT(STR_READ_REGISTER(2))
  7521.     CALL GB_EMPTY
  7522. C
  7523.     CALL GB_GIN(STR_PROMPT,12,.TRUE.,STR_GIN_BUFFER)!TERMINAL IGNORES PROMPT
  7524. C
  7525.     DECODE (12,950,STR_GIN_BUFFER) IX_GIN,IY_GIN
  7526. 950    FORMAT(I6,I6)
  7527. C
  7528.     XA(1)= IPICK
  7529.     XA(2)= IX_GIN/XGUPCM
  7530.     XA(3)= IY_GIN/YGUPCM
  7531. C
  7532.     STR_XHAIR(3)= 0
  7533.     LDUMMY= GB_TEST_FLUSH(4)
  7534.     CALL GB_INSERT(STR_ACKNOWLEDGE(1))
  7535.     CALL GB_INSERT(STR_XHAIR(1))        !MAKE CURSOR INVISIBLE
  7536.     CALL GB_INSERT(STR_XHAIR(2))
  7537.     CALL GB_INSERT(STR_XHAIR(3))
  7538. C
  7539.     RETURN
  7540. C
  7541. C    **********************
  7542. C    DEFINE COLOR USING RGB
  7543. C    **********************
  7544. C
  7545. 1000    CONTINUE
  7546. C
  7547.     RETURN
  7548. C
  7549. C    **********************
  7550. C    DEFINE COLOR USING HLB
  7551. C    **********************
  7552. C
  7553. 1100    CONTINUE
  7554. C
  7555.     RETURN
  7556. C
  7557. C    ***********************************
  7558. C    PERFORM GRAPHICS INPUT WITH BUTTONS
  7559. C    ***********************************
  7560. C
  7561. 1200    CONTINUE
  7562. C
  7563.     STR_XHAIR(3)= 1
  7564.     LDUMMY= GB_TEST_FLUSH(7)
  7565.     CALL GB_INSERT(STR_FLUSH(1))
  7566.     CALL GB_INSERT(STR_XHAIR(1))        !MAKE CROSS HAIR VISIBLE
  7567.     CALL GB_INSERT(STR_XHAIR(2))
  7568.     CALL GB_INSERT(STR_XHAIR(3))
  7569.     CALL GB_INSERT(STR_READ_BUTTON(1))    !WAIT FOR NEXT MOUSE BUTTON
  7570.     CALL GB_INSERT(STR_READ_BUTTON(2))
  7571.     CALL GB_INSERT(STR_READ_BUTTON(3))
  7572.     CALL GB_EMPTY
  7573. C
  7574.     CALL GB_GIN(0,15,.TRUE.,STR_GIN_BUFFER)    !IMPORTANT: SEND NO PROMPTS
  7575. C
  7576.     DECODE (15,1250,STR_GIN_BUFFER) IB_GIN,IX_GIN,IY_GIN
  7577. 1250    FORMAT(I3,I6,I6)
  7578. C
  7579.     XA(1)= 2**(IB_GIN-1)
  7580.     XA(2)= IX_GIN/XGUPCM
  7581.     XA(3)= IY_GIN/YGUPCM
  7582. C
  7583.     STR_XHAIR(3)= 0
  7584.     LDUMMY= GB_TEST_FLUSH(4)
  7585.     CALL GB_INSERT(STR_ACKNOWLEDGE(1))
  7586.     CALL GB_INSERT(STR_XHAIR(1))        !MAKE CURSOR INVISIBLE
  7587.     CALL GB_INSERT(STR_XHAIR(2))
  7588.     CALL GB_INSERT(STR_XHAIR(3))
  7589. C
  7590.     RETURN
  7591. C
  7592. C    *******************
  7593. C    DRAW FILLED POLYGON
  7594. C    *******************
  7595. C
  7596. 1300    CONTINUE
  7597.     NVERT= IFXN-1024
  7598.     LVECTOR_DRAWING= .FALSE.
  7599.     IF (NVERT.LT.3) RETURN
  7600. C
  7601.     IF (IXCURP.NE.0 .OR. IYCURP.NE.0) THEN
  7602.     LDUMMY= GB_TEST_FLUSH(5)
  7603.     CALL GB_INSERT(STR_MOVE)
  7604.     IXCURP= 0
  7605.     IYCURP= 0
  7606.     CALL RASTER_TECH_CONVERT(IXCURP,STR_XMOVE)
  7607.     CALL RASTER_TECH_CONVERT(IYCURP,STR_YMOVE)
  7608.     CALL GB_INSERT(STR_XMOVE(1))
  7609.     CALL GB_INSERT(STR_XMOVE(2))
  7610.     CALL GB_INSERT(STR_YMOVE(1))
  7611.     CALL GB_INSERT(STR_YMOVE(2))
  7612.     ENDIF
  7613. C
  7614.     LDUMMY= GB_TEST_FLUSH(4)
  7615.     CALL GB_INSERT(STR_POLY(1))
  7616.     CALL GB_INSERT(STR_POLY(2))
  7617.     CALL RASTER_TECH_CONVERT(NVERT,STR_NVERT)
  7618.     CALL GB_INSERT(STR_NVERT(1))
  7619.     CALL GB_INSERT(STR_NVERT(2))
  7620. C
  7621.     DO 1350 N= 1,NVERT
  7622.     LDUMMY= GB_TEST_FLUSH(4)
  7623.     IXVERT= XGUPCM*XA(N)+0.5
  7624.     IYVERT= YGUPCM*YA(N)+0.5
  7625.     CALL RASTER_TECH_CONVERT(IXVERT,STR_XVERT)
  7626.     CALL RASTER_TECH_CONVERT(IYVERT,STR_YVERT)
  7627.     CALL GB_INSERT(STR_XVERT(1))
  7628.     CALL GB_INSERT(STR_XVERT(2))
  7629.     CALL GB_INSERT(STR_YVERT(1))
  7630.     CALL GB_INSERT(STR_YVERT(2))
  7631. 1350    CONTINUE
  7632. C
  7633.     RETURN
  7634. C
  7635.     END
  7636.     SUBROUTINE RASTER_TECH_CONVERT(N,STR_N)
  7637. C
  7638. C    THIS ROUTINE CONVERTS INTEGER*2 TO RASTER TECHNOLOGY HI-LO BYTE
  7639. C
  7640.     INTEGER*2 N, NPOS, HIBYTE, LOBYTE
  7641. C
  7642.     BYTE STR_N(2), STR_BYTE(2)
  7643. C
  7644.     EQUIVALENCE (STR_BYTE(1),HIBYTE)
  7645.     EQUIVALENCE (STR_BYTE(2),LOBYTE)
  7646. C
  7647.     LOGICAL CARRY
  7648. C
  7649.     NPOS= IABS(N)
  7650. C
  7651.     HIBYTE= NPOS/256
  7652.     LOBYTE= MOD(NPOS,256)
  7653. C
  7654.     IF (N.GE.0) GO TO 100
  7655. C
  7656.     CARRY= (LOBYTE.EQ.0)
  7657.     HIBYTE= INOT(HIBYTE)        !NEXT FOUR LINES VAX/VHS SPECIFIC
  7658.     LOBYTE= INOT(LOBYTE) + 1
  7659.     HIBYTE= IIAND(255,HIBYTE)
  7660.     LOBYTE= IIAND(255,LOBYTE)
  7661. C
  7662.     IF (CARRY) HIBYTE= HIBYTE + 1
  7663. C
  7664. 100    CONTINUE
  7665.     STR_N(1)= STR_BYTE(1)
  7666.     STR_N(2)= STR_BYTE(2)
  7667. C
  7668.     RETURN
  7669. C
  7670.     END
  7671.     SUBROUTINE GDRTRO(IFXN,XA,YA)
  7672.     DIMENSION XA(8), YA(3)
  7673. C
  7674. C    VT100 WITH 640x480 RETROGRAPHICS DRIVER FOR DIGLIB/VAX
  7675. C
  7676. C-----------------------------------------------------------------------
  7677. C
  7678.     EXTERNAL LEN
  7679.     BYTE ESC, CSUB, TMODE, GS, CR, FF
  7680.     PARAMETER (ESC=27, CSUB=26, TMODE=24, GS=29, CR=13, FF=12)
  7681.     CHARACTER*(*) TERMINAL
  7682.     PARAMETER (TERMINAL='TT')
  7683. C
  7684. C    DEFINITIONS FOR DEVICE CONTROL
  7685. C
  7686.     BYTE STR_BEGIN_PLOT(14), STR_COLOR_SET(6)
  7687.     BYTE STR_END_PLOT(8)
  7688.     DATA STR_BEGIN_PLOT /ESC,'[','H',ESC,'[','J',GS,ESC,FF,
  7689.     1   ESC,'/','0','d',0/
  7690.     DATA STR_COLOR_SET /GS,ESC,'/','0','d',0/
  7691.     DATA STR_END_PLOT /ESC,'[','H',ESC,'[','J',0,0/
  7692. C
  7693. C    DEFINITIONS FOR GIN
  7694. C
  7695.     BYTE GINBUFR(8), PROMPT(4)
  7696.     DATA PROMPT /GS, ESC, CSUB, 0/
  7697.     DATA IGIN_IN_CHARS /6/        !5 FROM 4010 GIN, PLUS CR
  7698. C
  7699. C    DECLARE BUFFERING FUNCTION
  7700. C
  7701.     LOGICAL GB_TEST_FLUSH
  7702. C
  7703. C    DECLARE VARS NEED FOR DRIVER OPERATION
  7704. C
  7705.     LOGICAL LVECTOR_GOING, LDUMMY
  7706.     DIMENSION DCHAR(8)
  7707. C
  7708. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  7709. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  7710. C
  7711.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  7712.     DATA DCHAR /100.0, 21.001, 15.747, 30.419, 30.419, 1.0, 133.0, 1.0/
  7713. C
  7714. C*****************
  7715. C
  7716. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  7717. C
  7718.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  7719. C
  7720. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  7721. C
  7722.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  7723. C
  7724. C    *********************
  7725. C    INITIALIZE THE DEVICE
  7726. C    *********************
  7727. C
  7728. 100    CONTINUE
  7729. C
  7730. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  7731. C
  7732.     CALL GB_INITIALIZE(TMODE,0,TERMINAL,IERR)
  7733.     YA(1) = IERR
  7734.     LVECTOR_GOING = .FALSE.
  7735.     RETURN
  7736. C
  7737. C    **************************
  7738. C    GET FRESH PLOTTING SURFACE
  7739. C    **************************
  7740. C
  7741. 200    CONTINUE
  7742.     CALL GB_NEW_BUFFER
  7743.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  7744.     CALL GB_USE_TERMINATOR
  7745.     LVECTOR_GOING = .FALSE.
  7746.     RETURN
  7747. C
  7748. C    ****
  7749. C    MOVE
  7750. C    ****
  7751. C
  7752. 300    CONTINUE
  7753. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  7754.     IXPOSN = XGUPCM*XA(1)+0.5
  7755.     IYPOSN = YGUPCM*YA(1)+0.5
  7756.     LVECTOR_GOING = .FALSE.
  7757.     RETURN
  7758. C
  7759. C    ****
  7760. C    DRAW
  7761. C    ****
  7762. C
  7763. 400    CONTINUE
  7764.     IX = XGUPCM*XA(1)+0.5
  7765.     IY = YGUPCM*YA(1)+0.5
  7766.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  7767.     IF (LVECTOR_GOING) GO TO 410
  7768.     LDUMMY = GB_TEST_FLUSH(9)
  7769.     LVECTOR_GOING = .TRUE.
  7770.     CALL GB_INSERT(GS)
  7771.     CALL GB_USE_TERMINATOR
  7772.     CALL GD_4010_CONVERT((8*IXPOSN/5),(13*IYPOSN)/8)
  7773. 410    CALL GD_4010_CONVERT((8*IX/5),(13*IY)/8)
  7774.     IXPOSN = IX
  7775.     IYPOSN = IY
  7776.     RETURN
  7777. C
  7778. C    *****************************
  7779. C    FLUSH GRAPHICS COMMAND BUFFER
  7780. C    *****************************
  7781. C
  7782. 500    CONTINUE
  7783.     CALL GB_EMPTY
  7784.     CALL GB_IN_STRING(STR_END_PLOT)
  7785.     CALL GB_EMPTY
  7786.     LVECTOR_GOING = .FALSE.
  7787.     RETURN
  7788. C
  7789. C    ******************
  7790. C    RELEASE THE DEVICE
  7791. C    ******************
  7792. C
  7793. 600    CONTINUE
  7794. C
  7795. C    DE-ASSIGN THE CHANNAL
  7796. C
  7797.     CALL GB_FINISH(0)
  7798.     RETURN
  7799. C
  7800. C    *****************************
  7801. C    RETURN DEVICE CHARACTERISTICS
  7802. C    *****************************
  7803. C
  7804. 700    CONTINUE
  7805.     DO 720 I=1,8
  7806.     XA(I) = DCHAR(I)
  7807. 720    CONTINUE
  7808.     RETURN
  7809. C
  7810. C    ****************************
  7811. C    SELECT CURRENT DRAWING COLOR
  7812. C    ****************************
  7813. C
  7814. 800    CONTINUE
  7815.     LDUMMY = GB_TEST_FLUSH(8)
  7816.     ICOLOR = XA(1)
  7817.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 1) RETURN
  7818.     ICOLOR = 1-ICOLOR        !CONVERT 1 TO 0 AND 0 INTO 1
  7819.     STR_COLOR_SET(4) = 48+ICOLOR    !MAKE ASCII CHARACTER 0 OR 1
  7820.     CALL GB_IN_STRING(STR_COLOR_SET)
  7821.     CALL GB_USE_TERMINATOR
  7822.     LVECTOR_GOING = .FALSE.
  7823.     RETURN
  7824. C
  7825. C    **********************
  7826. C    PERFORM GRAPHICS INPUT
  7827. C    **********************
  7828. C
  7829. 900    CONTINUE
  7830.     CALL GB_EMPTY
  7831.     LVECTOR_GOING = .FALSE.
  7832. C
  7833.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  7834. C
  7835.     ICHAR = GINBUFR(1)
  7836.     IX1 = GINBUFR(2)
  7837.     IX2 = GINBUFR(3)
  7838.     IY1 = GINBUFR(4)
  7839.     IY2 = GINBUFR(5)
  7840. C
  7841.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  7842.     XA(2) = (5.0*(32*IAND(IX1,31)+IAND(IX2,31))/8.0)/XGUPCM
  7843.     XA(3) = (8.0*(32*IAND(IY1,31)+IAND(IY2,31))/13.0)/YGUPCM
  7844. C
  7845.     CALL GB_SEND_TTY(TMODE,1)
  7846.     RETURN
  7847.     END
  7848.     SUBROUTINE GDVERSTALL(IFXN,XA,YA)
  7849.     DIMENSION XA(8), YA(3)
  7850. C
  7851. C    DIGLIB VERSATEC GRAPHICS DEVICE DRIVER
  7852. C
  7853. C-----------------------------------------------------------------------
  7854. C
  7855.     DIMENSION DCHAR(8)
  7856.     LOGICAL*2 LDUMPIT, LWIDE
  7857. C
  7858. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  7859. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  7860. C
  7861.     EQUIVALENCE (DCHAR(2),X_FULL_SCALE)
  7862.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  7863.     DATA DCHAR /80.0, 21.336, 26.67, 78.7402, 78.7402, 1.0, 3.0, 1.0/
  7864.     SAVE LDUMPIT
  7865. C
  7866. C    SHOW WE WANT TALL NOT WIDE PLOTTING AREA
  7867. C
  7868.     LWIDE = .FALSE.
  7869. 10    CONTINUE
  7870. C
  7871. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  7872. C
  7873.     IF (IFXN .LE. 0 .OR. IFXN .GT. 7) RETURN
  7874. C
  7875. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  7876. C
  7877.     GO TO (100,200,300,400,500,600,700) IFXN
  7878. C
  7879. C    *********************
  7880. C    INITIALIZE THE DEVICE
  7881. C    *********************
  7882. C
  7883. 100    CONTINUE
  7884.     CALL PLOTS(0,0,0)
  7885.     CALL FACTOR(1.0/2.54)
  7886.     LDUMPIT = .FALSE.
  7887.     YA(1) = 0.0
  7888.     RETURN
  7889. C
  7890. C    **************************
  7891. C    GET FRESH PLOTTING SURFACE
  7892. C    **************************
  7893. C
  7894. 200    CONTINUE
  7895.     IF (LDUMPIT) THEN
  7896.         CALL PLOT(0.0, 0.0, -999)
  7897.         CALL FACTOR(1.0/2.54)
  7898.       ENDIF
  7899.     LDUMPIT = .FALSE.
  7900.     RETURN
  7901. C
  7902. C    ****
  7903. C    MOVE
  7904. C    ****
  7905. C
  7906. 300    CONTINUE
  7907.     IPEN = +3
  7908.     GO TO 450
  7909. C
  7910. C    ****
  7911. C    DRAW
  7912. C    ****
  7913. C
  7914. 400    CONTINUE
  7915.     IPEN = +2
  7916. 450    IF (LWIDE) THEN
  7917.         CALL PLOT(X_FULL_SCALE-YA(1), XA(1), IPEN)
  7918.       ELSE
  7919.         CALL PLOT(XA(1), YA(1), IPEN)
  7920.       END IF
  7921.     LDUMPIT = .TRUE.
  7922.     RETURN
  7923. C
  7924. C    *****************************
  7925. C    FLUSH GRAPHICS COMMAND BUFFER
  7926. C    *****************************
  7927. C
  7928. 500    CONTINUE
  7929. C
  7930. C    NOP ON VERSATEC - BGNPLT WILL TERMINATE PREVIOUS PLOT ON START
  7931. C        OF NEW PLOT.
  7932. C
  7933.     RETURN
  7934. C
  7935. C    ******************
  7936. C    RELEASE THE DEVICE
  7937. C    ******************
  7938. C
  7939. 600    CONTINUE
  7940.     CALL PLOT(0.0, 0.0, +999)
  7941.     CALL GDVERS_VPINIT
  7942.     RETURN
  7943. C
  7944. C    *****************************
  7945. C    RETURN DEVICE CHARACTERISTICS
  7946. C    *****************************
  7947. C
  7948. 700    CONTINUE
  7949.     DO 720 I=1,8
  7950.     XA(I) = DCHAR(I)
  7951. 720    CONTINUE
  7952.     IF (.NOT. LWIDE) RETURN
  7953.     XA(2) = DCHAR(3)
  7954.     XA(3) = DCHAR(2)
  7955.     RETURN
  7956. C
  7957. C    ALTERNATE ENTRY FOR WIDE PLOTTING AREA
  7958. C
  7959.     ENTRY GDVERSWIDE(IFXN,XA,YA)
  7960.     LWIDE = .TRUE.
  7961.     GO TO 10
  7962.     END
  7963.  
  7964.     SUBROUTINE GDVERS_VPINIT
  7965. C
  7966. C    Release versatec driver
  7967. C
  7968. C    Problem:
  7969. C
  7970. C    The Versaplot software has no way to re-initialize itself
  7971. C    once and "end of plot, end of run" call has been made.
  7972. C    That is, once DIGLIB releases the Versatec driver
  7973. C    (either because of a call to RLSDEV or DEVSEL) the application
  7974. C    program can NOT make more plots with the Versatec driver.
  7975. C
  7976. C    Solution:
  7977. C
  7978. C    Call this routine before calling after releasing the VERSATEC.
  7979. C    Then, the next call to DEVSEL, to select the Versatec driver, will
  7980. C    act as if it were the first call to DEVSEL.
  7981. C
  7982. C
  7983.     COMMON    /PPEP0/    LBLK, NBLK, LREC, LVEC, IUNIT, JUNIT, KUNIT, LUNIT,
  7984.     1    MUNIT, IPARM, IPCTR, IPREC, IEOF, IPBUF(128)
  7985. C
  7986.     COMMON    /PPEP1/    IX1, IY1, IX2, IY2, ISCAN, NSCAN, NBAND, NIPS, NIP0,
  7987.     1    NIPM1, LYNES, NIBSX, MSGLVL, XDOTS, YDOTS, PREF(2), RORG(2),
  7988.     2    PORT(2,2), IEND(4), ALMT, FACT, JPEN, XOFF, XFAC, YOFF, YFAC,
  7989.     3    NBITS, NBITM1, NBYTES, NBYTM1, MSK, LMSK, IOPEN, XA(13),
  7990.     4    YA(13), XC, YC, XO, YO, XT, YT, THETA, ANCC, ANCS, RADCO, FNN,
  7991.     5    FCTR, FACC, ISTAT, IPAT(16), NTP, JRCD, JWRD, MINREC, MAXREC,
  7992.     6    MAXPLT, NPLOT, FPLOT, NCLIP, NBAD, JBUF(128)
  7993. C
  7994. C    Make VERSAPLOT initialize itself on next call to
  7995. C    DEVSEL.
  7996. C
  7997. C    PPEP0
  7998. C
  7999.     IPCTR  = 129
  8000.     IPREC  = 1
  8001. C
  8002. C    PPEP1
  8003. C
  8004.     IOPEN  = 0
  8005.     RADCO  = 0.01745329
  8006.     FNN    = 999.0
  8007.     FCTR   = 0.7
  8008.     FACC   = 0.0
  8009.     THETA  = 0.0
  8010.     ANCC   = 1.0
  8011.     ANCS   = 0.0
  8012.     XC     = 0.0
  8013.     YC     = 0.0
  8014.     XT     = 0.0
  8015.     YT     = 0.0
  8016.     XO     = 0.0
  8017.     YO     = 0.0
  8018. C
  8019.     DO 10 I=1,13
  8020.        XA(I) = 0.0
  8021.        YA(I) = 0.0
  8022.  10    CONTINUE
  8023. C
  8024.     ISTAT  = 1
  8025.     NTP    = 1
  8026. C
  8027.     DO 20 I=1,16
  8028.        IPAT(I) = -1
  8029.  20    CONTINUE
  8030. C
  8031.     JRCD   = 1
  8032.     JWRD   = 1
  8033.     MINREC = 999999
  8034.     MAXREC = -1
  8035.     MAXPLT = -1
  8036.     NPLOT  = 1
  8037.     FPLOT  = 0.0
  8038.     NCLIP  = 0
  8039.     NBAD   = 0
  8040.     RETURN
  8041.     END
  8042.     SUBROUTINE GDVHR19(IFXN,XA,YA)
  8043.     DIMENSION XA(8), YA(3)
  8044. C
  8045. C    INTECOLOR VHR-19 DRIVER FOR DIGLIB/VAX
  8046. C       Drawing is done via the TEK 4010 compatability mode since this
  8047. C       provides a much more dense (and so faster) coordinate stream.
  8048. C       The terminal itself is placed in the ANSI mode.   It is switched
  8049. C       temporarily to TEK mode only for the duration of a buffer (or
  8050. C       less) of lines.
  8051. C
  8052.     BYTE ESC, CSUB, GS, CR, FF, US, BCOMMA
  8053.     PARAMETER (ESC=27, CSUB=26, GS=29, CR=13, FF=12, US=31, BCOMMA=44)
  8054.     CHARACTER*(*) TERMINAL
  8055.     PARAMETER (TERMINAL='TT')
  8056. C
  8057. C    DEFINITIONS FOR DEVICE CONTROL
  8058. C
  8059.     BYTE STR_END(4)
  8060.     BYTE STR_INIT_DEV(38)
  8061.     BYTE STR_BEGIN_PLOT(6), STR_COLOR_SET(8), STR_START_VECTOR(4)
  8062.     BYTE STR_POLYGON_START(8), STR_POLYGON_PATTERN(4)
  8063.     BYTE STR_COMMA_END(4), STR_END_PLOT(10)
  8064.     BYTE STRING(20)
  8065.     EXTERNAL LEN
  8066. C
  8067.     DATA STR_END /ESC,'A',2*0/
  8068.     DATA STR_INIT_DEV/
  8069.     1   ESC,'B',ESC,'T',
  8070.     1   'Z',',','1',',',        !ZOOM FACTOR OF 1
  8071.     2   'N',',','1','0','2','3',',','7',',', !PAN TO BOTTOM LEFT
  8072.     3   'I','H',',','7',',',    !STD COLORS, COLOR 1 (INTECOLOR 7)
  8073.     4   'T','F','F','F','F',',',    !LINE STYLE SOLID
  8074.     5   '#',',','7',',',        !WRITE TO ALL 3 PLANES
  8075.     6   'L',',','7',',','?',0/    !DISPLAY FROM ALL 3 PLANES, EXIT
  8076.     DATA STR_BEGIN_PLOT/
  8077.     1   ESC,'C',ESC,FF,0,0/        !ERASE SCREEN
  8078.     DATA STR_START_VECTOR/
  8079.     1   ESC,'C',GS,0/        !START A 4010 VECTOR
  8080.     DATA STR_END_PLOT /
  8081.     1   ESC,'A',
  8082.     2   ESC,'[','H',ESC,'[','J',2*0/!ERASE TEXT
  8083.     DATA STR_COLOR_SET /
  8084.     1   ESC,'B',ESC,'T','H',',',2*0/!SET COLOR PARTIAL COMMAND
  8085.     DATA STR_POLYGON_START/
  8086.     1   ESC,'B',ESC,'T','D',',',2*0/!START POLYGON
  8087.     DATA STR_POLYGON_PATTERN/
  8088.     1   ',','2',',',0/
  8089.     DATA STR_COMMA_END/
  8090.     1   ',','?',2*0/        !ENDS A COMMAND AND EXIT GRAPHICS MODE.
  8091. C
  8092. C    DEFINITIONS FOR GIN
  8093. C
  8094.     BYTE GINBUFR(8), PROMPT(6), STR_END_GIN(2)
  8095.     DATA PROMPT /ESC, 'C', ESC, CSUB, 0, 0/
  8096.     DATA IGIN_IN_CHARS /6/
  8097.     DATA STR_END_GIN /10,0/
  8098. C
  8099. C    COLOR MAP
  8100. C
  8101.     DIMENSION MAP_COLOR(8)
  8102.     DATA MAP_COLOR /0,7,1,2,4,3,5,6/
  8103. C
  8104. C    DECLARE BUFFERING FUNCTION
  8105. C
  8106.     LOGICAL GB_TEST_FLUSH
  8107. C
  8108. C    DECLARE VARS NEED FOR DRIVER OPERATION
  8109. C
  8110.     LOGICAL LVECTOR_GOING, LDUMMY
  8111.     DIMENSION DCHAR(8)
  8112. C
  8113. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  8114. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  8115. C
  8116.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  8117.     DATA DCHAR /19.0, 38.0, 28.5, 26.921, 26.921, 7.0, 389.0, 1.0/
  8118. C
  8119. C*****************
  8120. C
  8121. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  8122. C
  8123.     IF (IFXN .GT. 1026) GOTO 20000
  8124.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  8125. C
  8126. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  8127. C
  8128.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  8129. C
  8130. C    *********************
  8131. C    INITIALIZE THE DEVICE
  8132. C    *********************
  8133. C
  8134. 100    CONTINUE
  8135. C
  8136. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  8137. C
  8138.     CALL GB_INITIALIZE(0,STR_END,TERMINAL,IERR)
  8139.     YA(1) = IERR
  8140.     IF (IERR .NE. 0) RETURN
  8141. C
  8142. C    INITIALIZE THE VHR-19
  8143. C
  8144.     CALL GB_IN_STRING(STR_INIT_DEV)
  8145.     CALL GB_EMPTY
  8146.     LVECTOR_GOING = .FALSE.
  8147.     RETURN
  8148. C
  8149. C    **************************
  8150. C    GET FRESH PLOTTING SURFACE
  8151. C    **************************
  8152. C
  8153. 200    CONTINUE
  8154.     CALL GB_EMPTY
  8155.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  8156.     CALL GB_EMPTY
  8157.     LVECTOR_GOING = .FALSE.
  8158.     RETURN
  8159. C
  8160. C    ****
  8161. C    MOVE
  8162. C    ****
  8163. C
  8164. 300    CONTINUE
  8165. C    CONVERT CM. TO GRAPHICS UNITS ROUNDED
  8166.     IXPOSN = XGUPCM*XA(1)+0.5
  8167.     IYPOSN = YGUPCM*YA(1)+0.5
  8168.     LVECTOR_GOING = .FALSE.
  8169.     RETURN
  8170. C
  8171. C    ****
  8172. C    DRAW
  8173. C    ****
  8174. C
  8175. 400    CONTINUE
  8176.     IX = XGUPCM*XA(1)+0.5
  8177.     IY = YGUPCM*YA(1)+0.5
  8178.     LVECTOR_GOING = LVECTOR_GOING .AND. (.NOT. GB_TEST_FLUSH(4))
  8179.     IF (LVECTOR_GOING) GO TO 410
  8180.     LDUMMY = GB_TEST_FLUSH(9)
  8181.     LVECTOR_GOING = .TRUE.
  8182.     CALL GB_IN_STRING(STR_START_VECTOR)
  8183.     CALL GD_4010_CONVERT(IXPOSN,IYPOSN)
  8184. 410    CALL GD_4010_CONVERT(IX,IY)
  8185.     IXPOSN = IX
  8186.     IYPOSN = IY
  8187.     RETURN
  8188. C
  8189. C    *****************************
  8190. C    FLUSH GRAPHICS COMMAND BUFFER
  8191. C    *****************************
  8192. C
  8193. 500    CONTINUE
  8194.     CALL GB_TEST_FLUSH(LEN(STR_END_PLOT))
  8195.     CALL GB_IN_STRING(STR_END_PLOT)
  8196.     CALL GB_EMPTY
  8197.     LVECTOR_GOING = .FALSE.
  8198.     RETURN
  8199. C
  8200. C    ******************
  8201. C    RELEASE THE DEVICE
  8202. C    ******************
  8203. C
  8204. 600    CONTINUE
  8205. C
  8206. C    DE-ASSIGN THE CHANNAL
  8207. C
  8208.     CALL GB_EMPTY
  8209.     CALL GB_FINISH(0)
  8210.     RETURN
  8211. C
  8212. C    *****************************
  8213. C    RETURN DEVICE CHARACTERISTICS
  8214. C    *****************************
  8215. C
  8216. 700    CONTINUE
  8217.     DO 720 I=1,8
  8218.     XA(I) = DCHAR(I)
  8219. 720    CONTINUE
  8220.     RETURN
  8221. C
  8222. C    ****************************
  8223. C    SELECT CURRENT DRAWING COLOR
  8224. C    ****************************
  8225. C
  8226. 800    CONTINUE
  8227.     LDUMMY = GB_TEST_FLUSH(12)
  8228.     ICOLOR = XA(1)
  8229.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 7) RETURN
  8230.     CALL GB_IN_STRING(STR_COLOR_SET)
  8231.     CALL NUMSTR(MAP_COLOR(1+ICOLOR),STRING)
  8232.     CALL GB_IN_STRING(STRING)
  8233.     CALL GB_IN_STRING(STR_COMMA_END)
  8234.     LVECTOR_GOING = .FALSE.
  8235.     RETURN
  8236. C
  8237. C    **********************
  8238. C    PERFORM GRAPHICS INPUT
  8239. C    **********************
  8240. C
  8241. 900    CONTINUE
  8242. C
  8243. C    DO A GIN
  8244. C
  8245.     CALL GB_EMPTY
  8246. C
  8247.     CALL GB_GIN(PROMPT,IGIN_IN_CHARS,.TRUE.,GINBUFR)
  8248. C
  8249.     ICHAR = GINBUFR(1)
  8250.     IX1 = GINBUFR(2)
  8251.     IX2 = GINBUFR(3)
  8252.     IY1 = GINBUFR(4)
  8253.     IY2 = GINBUFR(5)
  8254. C
  8255.     XA(1) = IAND(ICHAR,127)        !PICK CHARACTER
  8256.     IX_GIN_CURSOR = 32*IAND(IX1,31)+IAND(IX2,31)
  8257.     XA(2) = IX_GIN_CURSOR/XGUPCM
  8258.     IY_GIN_CURSOR = 32*IAND(IY1,31)+IAND(IY2,31)
  8259.     XA(3) = IY_GIN_CURSOR/YGUPCM
  8260. C
  8261.     CALL GB_IN_STRING(STR_END_GIN)
  8262.     CALL GB_EMPTY
  8263.     RETURN
  8264. C
  8265. C    *******************
  8266. C    DRAW FILLED POLYGON
  8267. C    *******************
  8268. C
  8269. 20000    CONTINUE
  8270.     NPTS = IFXN - 1024
  8271.     CALL GB_EMPTY
  8272.     CALL GB_IN_STRING(STR_POLYGON_START)
  8273.     CALL NUMSTR(NPTS,STRING)
  8274.     CALL GB_IN_STRING(STRING)
  8275.     CALL GB_IN_STRING(STR_POLYGON_PATTERN)
  8276. C
  8277. C    DO VERTICES 1 THRU N.
  8278. C
  8279.         DO 20010 I = 1, NPTS
  8280.         IX = XGUPCM*XA(I)+0.5
  8281.         IY = YGUPCM*YA(I)+0.5
  8282.         CALL NUMSTR(IX,STRING)
  8283.         CALL GB_IN_STRING(STRING)
  8284.         CALL GB_INSERT(BCOMMA)
  8285.         CALL NUMSTR(IY,STRING)
  8286.         CALL GB_IN_STRING(STRING)
  8287.         CALL GB_INSERT(BCOMMA)
  8288. 20010        CONTINUE
  8289.     CALL GB_IN_STRING(STR_COMMA_END)
  8290.     LVECTOR_GOING = .FALSE.
  8291.     RETURN
  8292.     END
  8293.     SUBROUTINE GDVT125(IFXN,XA,YA)
  8294.     DIMENSION XA(8), YA(3)
  8295. C
  8296. C    VT125 DRIVER FOR DIGLIB/VAX
  8297. C        Modified for DIGLIB V3 by Hal Brand 8-Feb-1985.
  8298. C
  8299. C    Opinion of Hal Brand:
  8300. C        It is completely misleading to even think of VT125 as graphics
  8301. C        devices.   DEC does not know the first thing about making
  8302. C        graphics terminals, and by their track record (VT240/241)
  8303. C        probably never will.   You will probably be very disappointed
  8304. C        if you use this driver for two reasons: 1) The driver may not
  8305. C        work well (and I don't really care cause of the above), and
  8306. C        2) The truth in the opinions above.
  8307. C
  8308. C---------------------------------------------------------------------------
  8309. C
  8310.     BYTE ESC
  8311.     PARAMETER (ESC=27)
  8312.     CHARACTER*(*) TERMINAL
  8313.     PARAMETER (TERMINAL='TT')
  8314. C
  8315. C    DEFINITIONS FOR DEVICE CONTROL
  8316. C
  8317.     BYTE STR_END(4)
  8318.     BYTE STR_INIT(39)
  8319.     BYTE STR_BEGIN_PLOT(16)
  8320.     BYTE STR_COLOR_SET(10)
  8321.     BYTE STR_PREFACE(4)
  8322.     BYTE GINBUFR(14)
  8323.     BYTE PROMPT(7)
  8324.     BYTE STR_COORD(10)
  8325.     BYTE BEGIN_CHAR, CHAR_P, CHAR_V
  8326.     DATA CHAR_LEFT_BRACKET /'['/
  8327.     DATA CHAR_RIGHT_BRACKET /']'/
  8328.     DATA CHAR_V /'V'/
  8329.     DATA CHAR_P /'P'/
  8330.     BYTE COLOR(8)
  8331.     DATA COLOR /'D','W','R','G','B','Y','M','C'/
  8332. C
  8333. C    THE VT125 DRIVER USES THE DIGLIB/VAX STANDARD TERMINAL BUFFERING
  8334. C     SUBROUTINES.   GRAPHIC COMMANDS ARE BUFFERED BY THESE SUBROUTINES
  8335. C     AND SENT TO THE USERS TERMINAL UNDER PROGRAM CONTROL.
  8336. C
  8337. C    ***
  8338. C    STR_END CONTAINS THE STRING WHICH IS APPENDED TO THE COMMAND BUFFER
  8339. C     JUST BEFORE IT IS SENT TO THE TERMINAL.   THIS ELIMINATES THE NEED
  8340. C     TO CONSTANTLY REMEMBER TO APPEND THIS STRING JUST BEFORE FLUSHING
  8341. C     THE BUFFER.
  8342. C    ***
  8343.     DATA STR_END /ESC,'\',0,0/
  8344. C
  8345. C    ***
  8346. C    STR_INIT CONTAINS THE STRING TO INITIALIZE THE VT125.   THIS STRING
  8347. C     IS ONLY SENT WHEN WHEN IFXN=1 (I.E. AT "DEVSEL" TIME).
  8348. C    ***
  8349.     DATA STR_INIT /
  8350.     1   ESC,'[','H',            !HOME ALPHA CURSOR
  8351.     2   ESC,'[','J',            !ERASE ALPHA TO END OF SCREEN
  8352.     3   ESC,'P','p',            !ENTER ReGIS
  8353.     4   'S','(','I','D',            !SET SCREEN MODE dark
  8354.     5   'A','[','0',',','4','7','9',']',    !SET ADDRESS TRANSLATION
  8355.     6   '[','7','6','7',',','0',']',')',    !so origin is lower left
  8356.     5   'W','(','I','W','R','P','1',')',    !SET WRITING MODE
  8357.     6   0,0/
  8358. C
  8359. C    ***
  8360. C    STR_BEGIN_PLOT CONTAINS THE STRING TO "GET A FRESH PLOTTING SURFACE"
  8361. C     AND TO MAKE SURE THE DEVICE IS IN "NORMAL" MODE, READY TO PLOT.
  8362. C    ***
  8363.     DATA STR_BEGIN_PLOT /
  8364.     1   ESC,'P','p',            !ENTER ReGIS
  8365.     2   'S','(','I','D','E',')',        !SET BKGD DARK & ERASE SCREEN
  8366.     3   'W','(','I','W','R',')',0/        !WRITE IN WHITE
  8367. C
  8368. C    ***
  8369. C    STR_COLOR_SET CONTAINS THE STRING TO SELECT A NEW COLOR.
  8370. C     THIS STRINGS CONTAINS A DUMMY ARGUMENT THAT IS MODIFIED AT RUN TIME
  8371. C     TO BE THE COLOR SELECTED.
  8372. C    ICOLOR_BYTE IS THE SUBSCRIPT OF THE BYTE TO BE MODIFIED IN THE
  8373. C     SET COLOR COMMAND.
  8374. C    ***
  8375.     DATA STR_COLOR_SET /
  8376.     1   ESC,'P','p',            !ENTER ReGIS
  8377.     2   'W','(','I','W',')',0,0/        !WRITE IN COLOR or MONO
  8378.     DATA ICOLOR_BYTE /7/
  8379. C
  8380. C    ***
  8381. C    STR_PREFACE CONTAINS THE ReGIS ENTRY STRING.
  8382. C    ***
  8383.     DATA STR_PREFACE / ESC,'P','p',0/
  8384. C
  8385. C    ***
  8386. C    PROMPT IS STRING SENT TO VT125 TO REQUEST IT DISPLAY THE GRAPHICS
  8387. C     CURSOR, WAIT TILL USER HITS A KEY, THEN RETURN THE GRAPHICS CURSOR
  8388. C     POSITION ALONG WITH THE KEY THE USER HIT.
  8389. C    ***
  8390.     DATA PROMPT /
  8391.     1   ESC,'P','p',            !ENTER ReGIS
  8392.     2   'R','(','P',')'/
  8393. C
  8394. C    ***
  8395. C    IGIN_IN_CHARACTERS IS THE EXPECTED NUMBER OF CHARACTERS RETURNED
  8396. C     BY THE VT125 IN RESPONSE TO "PROMPT".
  8397. C    ***
  8398.     DATA IGIN_IN_CHARS /12/
  8399. C
  8400. C    ***
  8401. C****************************************************************************
  8402. C
  8403. C    DECLARE BUFFERING FUNCTION
  8404. C
  8405.     LOGICAL GB_TEST_FLUSH
  8406. C
  8407. C    DECLARE VARS NEED FOR DRIVER OPERATION
  8408. C
  8409.     LOGICAL L_PREFACED, LDUMMY
  8410.     DIMENSION DCHAR(7)
  8411. C
  8412. C    MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  8413. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  8414. C
  8415.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  8416. C
  8417. C    FOR DESCRIPTION OF DCHAR, SEE "DEVICE CHARACTERISTICS" RETURNED
  8418. C     BY DRIVER WHEN IFXN=7 (I.E. GET DEVICE CHARACTERISTICS)
  8419. C
  8420.     DATA DCHAR /125.0, 25.583, 15.933, 30.0, 15.0, 3.0, 5.0, 1.0/
  8421. C
  8422. C*****************
  8423. C
  8424. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  8425. C
  8426.     IF (IFXN .LE. 0 .OR. IFXN .GT. 9) RETURN
  8427. C
  8428. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  8429. C
  8430.     GO TO (100,200,300,400,500,600,700,800,900) IFXN
  8431. C
  8432. C    *********************
  8433. C    INITIALIZE THE DEVICE
  8434. C    *********************
  8435. C
  8436. 100    CONTINUE
  8437. C
  8438. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  8439. C
  8440.     CALL GB_INITIALIZE(13,STR_END,TERMINAL,IERR)
  8441.     YA(1) = IERR
  8442.     IF (IERR .NE. 0) RETURN
  8443. C
  8444. C    THEN, INITIALIZE THE VT125
  8445. C
  8446.     CALL GB_IN_STRING(STR_INIT)
  8447.     GO TO 290
  8448. C
  8449. C    **************************
  8450. C    GET FRESH PLOTTING SURFACE
  8451. C    **************************
  8452. C
  8453. 200    CONTINUE
  8454.     CALL GB_NEW_BUFFER
  8455.     CALL GB_IN_STRING(STR_BEGIN_PLOT)
  8456. 290    CALL GB_EMPTY
  8457.     L_PREFACED = .FALSE.
  8458.     RETURN
  8459. C
  8460. C    ****
  8461. C    MOVE
  8462. C    ****
  8463. C
  8464. 300    CONTINUE
  8465.     BEGIN_CHAR = CHAR_P
  8466.     GO TO 420
  8467. C
  8468. C    ****
  8469. C    DRAW
  8470. C    ****
  8471. C
  8472. 400    CONTINUE
  8473.     BEGIN_CHAR = CHAR_V
  8474. C
  8475. 420    CONTINUE
  8476. C
  8477. C    CONVERT CM TO VT125 GRAPHICS UNITS
  8478. C
  8479.     IX = XGUPCM*XA(1)+0.5
  8480.     IY = 2*INT(YGUPCM*YA(1)+0.5)
  8481. C
  8482. C    SEE IF ENOUGH ROOM IN BUFFER FOR THIS COMMAND
  8483. C     WE NEED 10 CHARACTERS OF ROOM, SO BE SAFE AS MAKE SURE 12 LEFT.
  8484. C
  8485.     L_PREFACED = L_PREFACED .AND. (.NOT. GB_TEST_FLUSH(12))
  8486.     IF (.NOT. L_PREFACED) CALL GB_IN_STRING(STR_PREFACE)
  8487. C
  8488. C    INSERT THE ReGIS COMMAND TO MOVE/DRAW
  8489.     CALL GB_INSERT(BEGIN_CHAR)
  8490.     ENCODE (9,431,STR_COORD) IX,IY
  8491. 431    FORMAT('[',I3,',',I3,']')
  8492.     STR_COORD(10) = 0
  8493.     CALL GB_IN_STRING(STR_COORD)
  8494.     RETURN
  8495. C
  8496. C    *****************************
  8497. C    FLUSH GRAPHICS COMMAND BUFFER
  8498. C    *****************************
  8499. C
  8500. 500    CONTINUE
  8501.     CALL GB_EMPTY
  8502.     L_PREFACED = .FALSE.
  8503.     RETURN
  8504. C
  8505. C    ******************
  8506. C    RELEASE THE DEVICE
  8507. C    ******************
  8508. C
  8509. 600    CONTINUE
  8510. C
  8511. C    DO NOTHING - LET USER KILL PICTURE
  8512. C
  8513.     CALL GB_EMPTY
  8514.     RETURN
  8515. C
  8516. C    *****************************
  8517. C    RETURN DEVICE CHARACTERISTICS
  8518. C    *****************************
  8519. C
  8520. 700    CONTINUE
  8521.     DO 720 I=1,8
  8522.     XA(I) = DCHAR(I)
  8523. 720    CONTINUE
  8524.     RETURN
  8525. C
  8526. C    ****************************
  8527. C    SELECT CURRENT DRAWING COLOR
  8528. C    ****************************
  8529. C
  8530. 800    CONTINUE
  8531.     CALL GB_EMPTY
  8532.     ICOLOR = XA(1) + 1
  8533.     IF (ICOLOR .LT. 1 .OR. ICOLOR .GT. 8) RETURN
  8534.     STR_COLOR_SET(ICOLOR_BYTE) = COLOR(ICOLOR)
  8535.     CALL GB_IN_STRING(STR_COLOR_SET)
  8536.     L_PREFACED = .TRUE.
  8537.     RETURN
  8538. C
  8539. C    **********************
  8540. C    PERFORM GRAPHICS INPUT
  8541. C    **********************
  8542. C
  8543. 900    CONTINUE
  8544.     CALL GB_EMPTY
  8545.     L_PREFACED = .FALSE.
  8546. C
  8547. C    ASK FOR 1 GIN INPUT
  8548. C
  8549.     CALL GB_GIN(PROMPT,-IGIN_IN_CHARS,.TRUE.,GINBUFR)
  8550.     TYPE 992,GINBUFR
  8551. 992    FORMAT(' Ginbufr',14O4)
  8552. C
  8553. C    GET KEY PRESSED
  8554. C
  8555. c    I = 3
  8556. c    XA(1) = GINBUFR(1)
  8557. c    IF (GINBUFR(1) .EQ. CHAR_LEFT_BRACKET) THEN
  8558. c        XA(1) = 13
  8559. c        I = 2
  8560. c    ENDIF
  8561. C
  8562. C    GET X,Y
  8563. C
  8564. c    DECODE (11,991,GINBUFR(I)) XA(2), XA(3)
  8565. 991    FORMAT(F3.0,1X,F3.0)
  8566. c    XA(2) = XA(2)/XGUPCM
  8567. c    XA(3) = 0.5*XA(3)/YGUPCM
  8568.     RETURN
  8569.     END
  8570.     subroutine gdvt240(ifxn,xa,ya)
  8571. c******************************************************************************
  8572. c
  8573. c Title: GDVT240
  8574. c Version: 1.0
  8575. c Date: 5-Apr-84
  8576. c Written by: Steve Wolfe
  8577. c             Mini Micro Systems Group
  8578. c             Applications Systems Division 
  8579. c             Computations Department
  8580. C MODIFIED: HAL BRAND  14-AUG-84
  8581. c
  8582. c Purpose:
  8583. c
  8584. c    GDVT240 is the DIGLIB device driver for the DEC VT240/241 graphics
  8585. c    terminals. 
  8586. c
  8587. C WARNING: THIS DRIVER MAY HAVE BUGS - IT IS NOT SUPPORTED.
  8588. C    It is my (Hal Brand's) opinion that 240 resolution in Y is far too
  8589. C    little.   In addition, the VT240 doesn't separate the alphatext
  8590. C    from the graphics leading to numerous problems.   If you have never
  8591. C    used a real graphics terminal before, your probably won't hate using
  8592. C    a VT240 for graphics, however, if you have ever used a real graphics
  8593. C    terminal, you will be very very disappointed.
  8594. c
  8595. c******************************************************************************
  8596.     dimension xa(8), ya(3)
  8597. c
  8598. c    DEC VT240 driver for diglib/vax
  8599. c
  8600.     byte esc
  8601.     integer f1,f2,str_length
  8602.     parameter (esc=27)
  8603.     character*(*) terminal
  8604.     parameter (terminal='TT')
  8605.     logical cursor_moved
  8606. c
  8607. c    definitions for device control
  8608. c
  8609.     byte str_init_dev(66)
  8610.     byte str_begin_plot(14)
  8611.     byte str_rls_dev(6)
  8612.     byte str_move_pos(14)
  8613.     byte str_draw_vec(11)
  8614.     byte str_regis_mode(5)
  8615.     byte str_draw_point(4)
  8616.     BYTE STR_COLOR_SET(6)
  8617.     data str_init_dev/
  8618.      1        esc,'[','?','3','8','l',    !4014 => VT200 mode
  8619.      2        esc,'P','1','p',        !VT200 => REGIS mode
  8620.      3        's','(','a','[','0',',','4','9','9',']',
  8621.      4        '[','7','9','9',',','0',']',')',!Origin is lower left
  8622.      5        'w','(','f','3',')',        !allow writing to both planes
  8623.      6        'w','(','i','1',')',        !select color 3 (white)
  8624.     7   'S','(','M','1','(','A','W',')',
  8625.     8   '2','(','A','R',')','3','(','A','G',')',
  8626.      9        esc,'/',ESC,'[','H',ESC,'[','J',0,0/ !back to VT200 mode
  8627.     data str_begin_plot/
  8628.      1        esc,'P','1','p',        !VT200 => REGIS mode
  8629.      2        's','(','e',')',        !erase screen
  8630.      3        esc,'/',            !Back to VT200 mode
  8631.      4        esc,'[','H',0/            !Home the alpha cursor
  8632.     data str_rls_dev /esc,'/',esc,'[','H',0/
  8633.     data str_move_pos/'p','[',3*'x',',',3*'y',']','V','[',']',0/
  8634.     data str_draw_vec/'v','[',3*'x',',',3*'y',']',0/
  8635.     data str_regis_mode/esc,'P','1','p',0/
  8636.     data str_draw_point/'p','[',']',0/
  8637.     DATA STR_COLOR_SET / 'w','(','i','1',')',0 /
  8638. c
  8639. c    definitions for gin
  8640. c
  8641.     byte ginbufr(40), prompt(8)
  8642.     data prompt /'r','(','p','(','i',2*')',0/
  8643.     data igin_in_chars /18/
  8644.     DATA ICURX /400/
  8645.     DATA ICURY /240/
  8646. c
  8647. c    declare buffering function
  8648. c
  8649.     logical gb_test_flush, LDUMMY
  8650. c
  8651. c    declare vars need for driver operation
  8652. c
  8653.     dimension dchar(8)
  8654. c
  8655. c    make nice names for the devices resolution in x and y
  8656. c     ("xgupcm" is x graphics units per centimeter)
  8657. c
  8658.     equivalence (dchar(4),xgupcm), (dchar(5),ygupcm)
  8659.     data dchar /240.0, 23.78, 14.88, 33.6, 16.8, 3.0, 129.0, 1.0/
  8660.     DATA YFUDGE /2.0/
  8661. c
  8662. c*****************
  8663. c
  8664. c    first verify we got a graphics function we can handle
  8665. c
  8666.     if (ifxn .le. 0 .or. ifxn .gt. 9) return
  8667. c
  8668. c    now dispatch to the proper code to handle that function
  8669. c
  8670.     go to (100,200,300,400,500,600,700,800,900) ifxn
  8671. c
  8672. c    *********************
  8673. c    initialize the device
  8674. c    *********************
  8675. c
  8676. 100    continue
  8677. c
  8678. c    first, initialize the buffer subroutines
  8679. c
  8680.     call gb_initialize(0,0,terminal,ierr)
  8681.     ya(1) = ierr
  8682.     if (ierr .ne. 0) return
  8683. c
  8684. C    INITIALIZE THE VT240
  8685. c
  8686.  
  8687.     call gb_in_string(str_init_dev)
  8688. 190    call gb_empty
  8689.     lvector_going = .false.
  8690.     return
  8691. c
  8692. c    **************************
  8693. c    get fresh plotting surface
  8694. c    **************************
  8695. c
  8696. 200    continue
  8697.     call gb_empty
  8698.     call gb_in_string(str_begin_plot)
  8699.     GO TO 190
  8700. c
  8701. c    ****
  8702. c    move
  8703. c    ****
  8704. c
  8705. 300    continue
  8706. c    convert cm. to graphics units rounded
  8707.     ixposn = xgupcm*xa(1)+0.5
  8708.     iyposn = YFUDGE*ygupcm*ya(1)+0.5
  8709.     lvector_going = .false.
  8710.     return
  8711. c
  8712. c    ****
  8713. c    draw
  8714. c    ****
  8715. c
  8716. 400    continue
  8717.     ix = xgupcm*xa(1)+0.5
  8718.     iy = YFUDGE*ygupcm*ya(1)+0.5
  8719. C    if (ix .ne. ixposn .or. iy .ne. iyposn) then
  8720. c
  8721. c Draw a vector from the current position to the new position
  8722. c
  8723. c Go into graphics mode
  8724. c
  8725.       call gb_test_flush(4)
  8726.       call gb_in_string(str_regis_mode)
  8727. c
  8728. c Move to the current position first (if necessary)
  8729. c
  8730.       If (.not. lvector_going) then
  8731.         f1 = num_dig(ixposn)
  8732.         f2 = num_dig(iyposn)
  8733.         str_length = f1 + f2 + 4
  8734.         encode((f1 + f2 + 2),9000,str_move_pos(3))ixposn,iyposn
  8735. 9000        format(i<f1>','i<f2>']')
  8736. C        str_move_pos(str_length + 1) = 0
  8737.         CALL SCOPY('v[]',STR_MOVE_POS(STR_LENGTH+1))
  8738.         call gb_test_flush(str_length+4)
  8739.         call gb_in_string(str_move_pos)
  8740.       endif
  8741. c
  8742. c Now draw the vector
  8743. c
  8744.       f1 = num_dig(ix)
  8745.       f2 = num_dig(iy)
  8746.       str_length = f1 + f2 + 4
  8747.       encode((f1 + f2 + 2),9000,str_draw_vec(3))ix,iy
  8748.       str_draw_vec(str_length + 1) = 0
  8749.       call gb_test_flush(str_length)
  8750.       call gb_in_string(str_draw_vec)
  8751. c
  8752. c update the current position
  8753. c
  8754.       ixposn = ix
  8755.       iyposn = iy
  8756. c
  8757. c Go back to alpha mode
  8758. c
  8759.       call gb_test_flush(5)
  8760.       call gb_in_string(str_rls_dev)
  8761.       call gb_empty
  8762.       lvector_going = .true.
  8763.     return
  8764. c
  8765. c    *****************************
  8766. c    flush graphics command buffer
  8767. c    *****************************
  8768. c
  8769. 500    continue
  8770.     call gb_empty
  8771.     return
  8772. c
  8773. c    ******************
  8774. c    release the device
  8775. c    ******************
  8776. c
  8777. 600    continue
  8778.     call gb_finish(str_rls_dev)
  8779.     return
  8780. c
  8781. c    *****************************
  8782. c    return device characteristics
  8783. c    *****************************
  8784. c
  8785. 700    continue
  8786.     do 720 i=1,8
  8787.     xa(i) = dchar(i)
  8788. 720    continue
  8789.     return
  8790. c
  8791. c    ****************************
  8792. c    select current drawing color
  8793. c    ****************************
  8794. c
  8795. 800    continue
  8796.     CALL GB_TEST_FLUSH(10)
  8797.     CALL GB_IN_STRING(STR_REGIS_MODE)
  8798.     ICOLOR = XA(1)
  8799.     IF (ICOLOR .LT. 0 .OR. ICOLOR .GT. 3) RETURN
  8800.     STR_COLOR_SET(4) = ICOLOR+48
  8801.     CALL GB_IN_STRING(STR_COLOR_SET)
  8802.     LVECTOR_GOING = .FALSE.
  8803.     CALL GB_TEST_FLUSH(5)
  8804.     CALL GB_IN_STRING(STR_RLS_DEV)
  8805.     CALL GB_EMPTY
  8806.     return
  8807. c
  8808. c    **********************
  8809. c    perform graphics input
  8810. c    **********************
  8811. c
  8812. 900    continue
  8813. c
  8814. c Move the cursor to previous position
  8815. c
  8816.     lvector_going = .false.
  8817.     call gb_test_flush(4)
  8818.     call gb_in_string(str_regis_mode)
  8819.     if (ixposn .ne. icurx .or. iyposn .ne. icury) then
  8820.       f1 = num_dig(icurx)
  8821.       f2 = num_dig(icury)
  8822.       str_length = f1 + f2 + 4
  8823.       encode((f1 + f2 + 2),9000,str_move_pos(3))icurx,icury
  8824.       str_move_pos(str_length + 1) = 0
  8825.       call gb_test_flush(str_length)
  8826.       call gb_in_string(str_move_pos)
  8827.     endif
  8828.     call gb_empty
  8829. c
  8830. c Wait for graphic input
  8831. c
  8832.   905    continue
  8833.     call gb_gin(prompt,igin_in_chars,.false.,ginbufr)
  8834.     IF (GINBUFR(1) .EQ. 13) THEN
  8835.         CALL GB_GIN(0,IGIN_IN_CHARS-1,.FALSE.,GINBUFR(2))
  8836.     ENDIF
  8837.     call gb_in_string(str_rls_dev)
  8838.     call gb_empty
  8839. c
  8840. c Parse the graphic input. It comes in the form: p[xxxxE-1,yyyyE-1], where
  8841. c 'p' is the pick character, 'xxxxE-1' & 'yyyyE-1' are the X & Y coordinates.
  8842. c The 'xE-1' or 'yE-1' may or may not be present in the coordinates. If the
  8843. c user is fast enough (dumb enough) to type two pick characters quickly then
  8844. c the graphic input will contain two pick characters (or more) and the 
  8845. c cursor position will be shifted to the right by the extra characters.
  8846. c This routine will always return the pick character JUST BEFORE THE
  8847. C LEFT BRACKET.
  8848. c
  8849. c Look for the left bracket
  8850. c
  8851.     do ilbrakt = 2,40
  8852.       if (ginbufr(ilbrakt) .eq. '[') goto 910
  8853.     enddo
  8854.     goto 905
  8855. c
  8856. c Look for the right bracket
  8857. c
  8858.   910    continue
  8859.     do irbrakt = ilbrakt + 1,40
  8860.       if (ginbufr(irbrakt) .eq. ']') goto 920
  8861.     enddo
  8862.     goto 905
  8863. c
  8864. c Decode and return the values
  8865. c
  8866.   920    continue
  8867.     length = irbrakt - ilbrakt - 1
  8868.     decode(length,9100,ginbufr(ilbrakt + 1))curx,cury
  8869.  9100    format(2f10.0)
  8870.     xa(1) = ginbufr(ILBRAKT-1)
  8871.     xa(2) = curx / xgupcm
  8872.     xa(3) = cury / (YFUDGE*ygupcm)
  8873.     icurx = curx
  8874.     icury = cury
  8875.     return
  8876.     end
  8877.  
  8878.  
  8879.     integer function num_dig(integer)
  8880.     implicit integer (a-z)
  8881.     num_dig = 1
  8882.     if (integer .gt. 9) num_dig = 2
  8883.     if (integer .gt. 99) num_dig = 3
  8884.     return
  8885.     end
  8886.     SUBROUTINE GDVECTRIX(IFXN,XA,YA)
  8887.     DIMENSION XA(8), YA(3)
  8888. C
  8889. C    VECTRIX VX128 DRIVER FOR DIGLIB/VAX (USES "HEX" FORMAT)
  8890. C
  8891. C---------------------------------------------------------------------------
  8892. C
  8893.     CHARACTER*(*) TERMINAL
  8894.     PARAMETER (TERMINAL='DIG_VECTRIX_TTY')
  8895. C
  8896. C    DEFINITIONS FOR DEVICE CONTROL
  8897. C
  8898.     BYTE STR_INIT_VECTRIX(4)
  8899.     DATA STR_INIT_VECTRIX /'G','K','F',0/
  8900.     INTEGER*2 COLOR_MAP(0:7)
  8901.     DATA COLOR_MAP /0,7,1,2,4,3,5,6/
  8902. C
  8903. C    DECLARE ARRAY FOR DEVICE PARAMETERS
  8904. C     MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  8905. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  8906. C
  8907.     DIMENSION DCHAR(8)
  8908.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  8909.     DATA DCHAR /128.0, 26.84, 19.16, 25.0, 25.0, 7.0, 789.0, 1.0/
  8910. C
  8911. C    DECLARE BUFFERING FUNCTION
  8912. C
  8913.     LOGICAL GB_TEST_FLUSH
  8914. C
  8915.     LOGICAL LDUMMY
  8916. C
  8917. C*****************
  8918. C
  8919. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  8920. C
  8921.     IF (IFXN .GT. 1026) GO TO 1200    !FILLED POLYGON
  8922.     IF (IFXN .LE. 0 .OR. IFXN .GT. 8) RETURN
  8923. C
  8924. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  8925. C
  8926.     GO TO (100,200,300,400,500,600,700,800) IFXN
  8927. C
  8928. C    *********************
  8929. C    INITIALIZE THE DEVICE
  8930. C    *********************
  8931. C
  8932. 100    CONTINUE
  8933. C
  8934. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  8935. C
  8936.     CALL GB_INITIALIZE(0,0,TERMINAL,IERR)
  8937.     YA(1) = IERR
  8938.     IF (IERR .NE. 0) RETURN
  8939.     CALL GB_IN_STRING(STR_INIT_VECTRIX)
  8940.     RETURN
  8941. C
  8942. C    **************************
  8943. C    GET FRESH PLOTTING SURFACE
  8944. C    **************************
  8945. C
  8946. 200    CONTINUE
  8947.     CALL GB_NEW_BUFFER
  8948.     CALL GB_INSERT('E')
  8949.     CALL GD_VECTRIX_WORD(0)
  8950.     CALL GB_IN_STRING('REC')
  8951.     ICOLOR = 1
  8952.     CALL GD_VECTRIX_WORD(COLOR_MAP(ICOLOR))
  8953.     RETURN
  8954. C
  8955. C    ****
  8956. C    MOVE
  8957. C    ****
  8958. C
  8959. 300    CONTINUE
  8960.     CALL GB_INSERT('M')
  8961.     GO TO 410
  8962. C
  8963. C    ****
  8964. C    DRAW
  8965. C    ****
  8966. C
  8967. 400    CONTINUE
  8968.     CALL GB_INSERT('L')
  8969. 410    CONTINUE
  8970. C
  8971.     IX = XGUPCM*XA(1)+0.5
  8972.     IY = YGUPCM*YA(1)+0.5
  8973.     LDUMMY = GB_TEST_FLUSH(6)
  8974.     CALL GD_VECTRIX_WORD(IX)
  8975.     CALL GD_VECTRIX_WORD(IY)
  8976.     RETURN
  8977. C
  8978. C    *****************************
  8979. C    FLUSH GRAPHICS COMMAND BUFFER
  8980. C    *****************************
  8981. C
  8982. 500    CONTINUE
  8983.     CALL GB_EMPTY
  8984.     RETURN
  8985. C
  8986. C    ******************
  8987. C    RELEASE THE DEVICE
  8988. C    ******************
  8989. C
  8990. 600    CONTINUE
  8991. C
  8992. C    DE-ASSIGN THE CHANNAL
  8993. C
  8994.     CALL GB_FINISH(0)
  8995.     RETURN
  8996. C
  8997. C    *****************************
  8998. C    RETURN DEVICE CHARACTERISTICS
  8999. C    *****************************
  9000. C
  9001. 700    CONTINUE
  9002.     DO 720 I=1,8
  9003.     XA(I) = DCHAR(I)
  9004. 720    CONTINUE
  9005.     RETURN
  9006. C
  9007. C    ****************************
  9008. C    SELECT CURRENT DRAWING COLOR
  9009. C    ****************************
  9010. C
  9011. 800    CONTINUE
  9012.     IF (XA(1) .LT. 0.0 .OR. XA(1) .GT. 7.0) RETURN
  9013.     ICOLOR = XA(1)
  9014.     CALL GB_INSERT('C')
  9015.     CALL GD_VECTRIX_WORD(COLOR_MAP(ICOLOR))
  9016.     RETURN
  9017. C
  9018. C    ***************
  9019. C    FILLED POLYGONS
  9020. C    ***************
  9021. C
  9022. 1200    CONTINUE
  9023.     N = IFXN-1024
  9024.     CALL GB_INSERT('F')
  9025.     CALL GD_VECTRIX_WORD(COLOR_MAP(ICOLOR))
  9026.     CALL GD_VECTRIX_WORD(N)
  9027.     DO 1220 I=1, N
  9028.         CALL GD_VECTRIX_WORD(INT(XGUPCM*XA(I)+0.5))
  9029.         CALL GD_VECTRIX_WORD(INT(YGUPCM*YA(I)+0.5))
  9030. 1220        CONTINUE
  9031.     RETURN
  9032.     END
  9033.  
  9034.  
  9035.     SUBROUTINE GD_VECTRIX_WORD(INT)
  9036.     INTEGER*2 INT
  9037. C
  9038.     CALL GB_INSERT(INT)
  9039.     CALL GB_INSERT(INT/256)
  9040.     RETURN
  9041.     END
  9042.     SUBROUTINE GDVECTRIX384(IFXN,XA,YA)
  9043.     DIMENSION XA(8), YA(3)
  9044. C
  9045. C    VECTRIX VX384 DRIVER FOR DIGLIB/VAX (USES "HEX" FORMAT)
  9046. C
  9047. C---------------------------------------------------------------------------
  9048. C
  9049.     CHARACTER*(*) TERMINAL
  9050.     PARAMETER (TERMINAL='DIG_VECTRIX_TTY')
  9051. C
  9052. C    DEFINITIONS FOR DEVICE CONTROL
  9053. C
  9054.     BYTE STR_INIT_VECTRIX(4)
  9055.     DATA STR_INIT_VECTRIX /'G','K','F',0/
  9056.     BYTE INIT_RGB(24)
  9057.     DATA INIT_RGB /0,0,0, 255,255,255, 255,0,0, 0,255,0, 0,0,255,
  9058.     1   255,255,0, 255,0,255, 0,255,255 /
  9059. C
  9060. C    DECLARE ARRAY FOR DEVICE PARAMETERS
  9061. C     MAKE NICE NAMES FOR THE DEVICES RESOLUTION IN X AND Y
  9062. C     ("XGUPCM" IS X GRAPHICS UNITS PER CENTIMETER)
  9063. C
  9064.     DIMENSION DCHAR(8)
  9065.     EQUIVALENCE (DCHAR(4),XGUPCM), (DCHAR(5),YGUPCM)
  9066.     DATA DCHAR /128.0, 26.84, 19.16, 25.0, 25.0, 7.0, 789.0, 1.0/
  9067. C
  9068. C    DECLARE BUFFERING FUNCTION
  9069. C
  9070.     LOGICAL GB_TEST_FLUSH
  9071. C
  9072.     LOGICAL LDUMMY
  9073. C
  9074. C*****************
  9075. C
  9076. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  9077. C
  9078.     IF (IFXN .GT. 1026) GO TO 1200    !FILLED POLYGON
  9079.     IF (IFXN .LE. 0 .OR. IFXN .GT. 10) RETURN
  9080. C
  9081. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  9082. C
  9083.     GO TO (100,200,300,400,500,600,700,800,900,1000) IFXN
  9084. C
  9085. C    *********************
  9086. C    INITIALIZE THE DEVICE
  9087. C    *********************
  9088. C
  9089. 100    CONTINUE
  9090. C
  9091. C    FIRST, INITIALIZE THE BUFFER SUBROUTINES
  9092. C
  9093.     CALL GB_INITIALIZE(0,0,TERMINAL,IERR)
  9094.     YA(1) = IERR
  9095.     IF (IERR .NE. 0) RETURN
  9096.     CALL GB_IN_STRING(STR_INIT_VECTRIX)
  9097.     RETURN
  9098. C
  9099. C    **************************
  9100. C    GET FRESH PLOTTING SURFACE
  9101. C    **************************
  9102. C
  9103. 200    CONTINUE
  9104.     CALL GB_NEW_BUFFER
  9105.     CALL GB_INSERT('E')
  9106.     CALL GD_VECTRIX_WORD(0)
  9107.     CALL GB_IN_STRING('REC')
  9108.     ICOLOR = 1
  9109.     CALL GD_VECTRIX_WORD(ICOLOR)
  9110.     CALL GB_INSERT('Q')
  9111.     CALL GD_VECTRIX_WORD(0)
  9112.     CALL GD_VECTRIX_WORD(8)
  9113.     DO 220 I=1,24
  9114.         CALL GB_INSERT(INIT_RGB(I))
  9115. 220        CONTINUE
  9116.     RETURN
  9117. C
  9118. C    ****
  9119. C    MOVE
  9120. C    ****
  9121. C
  9122. 300    CONTINUE
  9123.     CALL GB_INSERT('M')
  9124.     GO TO 410
  9125. C
  9126. C    ****
  9127. C    DRAW
  9128. C    ****
  9129. C
  9130. 400    CONTINUE
  9131.     CALL GB_INSERT('L')
  9132. 410    CONTINUE
  9133. C
  9134.     IX = XGUPCM*XA(1)+0.5
  9135.     IY = YGUPCM*YA(1)+0.5
  9136.     LDUMMY = GB_TEST_FLUSH(6)
  9137.     CALL GD_VECTRIX_WORD(IX)
  9138.     CALL GD_VECTRIX_WORD(IY)
  9139.     RETURN
  9140. C
  9141. C    *****************************
  9142. C    FLUSH GRAPHICS COMMAND BUFFER
  9143. C    *****************************
  9144. C
  9145. 500    CONTINUE
  9146.     CALL GB_EMPTY
  9147.     RETURN
  9148. C
  9149. C    ******************
  9150. C    RELEASE THE DEVICE
  9151. C    ******************
  9152. C
  9153. 600    CONTINUE
  9154. C
  9155. C    DE-ASSIGN THE CHANNAL
  9156. C
  9157.     CALL GB_FINISH(0)
  9158.     RETURN
  9159. C
  9160. C    *****************************
  9161. C    RETURN DEVICE CHARACTERISTICS
  9162. C    *****************************
  9163. C
  9164. 700    CONTINUE
  9165.     DO 720 I=1,8
  9166.     XA(I) = DCHAR(I)
  9167. 720    CONTINUE
  9168.     RETURN
  9169. C
  9170. C    ****************************
  9171. C    SELECT CURRENT DRAWING COLOR
  9172. C    ****************************
  9173. C
  9174. 800    CONTINUE
  9175.     IF (XA(1) .LT. 0.0 .OR. XA(1) .GT. 7.0) RETURN
  9176.     ICOLOR = XA(1)
  9177.     CALL GB_INSERT('C')
  9178.     CALL GD_VECTRIX_WORD(COLOR_MAP(ICOLOR))
  9179.     RETURN
  9180. 900    RETURN
  9181. C
  9182. C    **********************
  9183. C    DEFINE COLOR USING RGB
  9184. C    **********************
  9185. C
  9186. 1000    CONTINUE
  9187.     CALL GB_INSERT('Q')
  9188.     CALL GD_VECTRIX_WORD(INT(XA(1))
  9189.     CALL GD_VECTRIX_WORD(1)
  9190.     DO 1010 I=1,3
  9191.         CALL GB_INSERT(INT(2.55*YA(I)+0.5))
  9192. 1010        CONTINUE
  9193.     RETURN
  9194. C
  9195. C    ***************
  9196. C    FILLED POLYGONS
  9197. C    ***************
  9198. C
  9199. 1200    CONTINUE
  9200.     N = IFXN-1024
  9201.     CALL GB_INSERT('F')
  9202.     CALL GD_VECTRIX_WORD(COLOR_MAP(ICOLOR))
  9203.     CALL GD_VECTRIX_WORD(N)
  9204.     DO 1220 I=1, N
  9205.         CALL GD_VECTRIX_WORD(INT(XGUPCM*XA(I)+0.5))
  9206.         CALL GD_VECTRIX_WORD(INT(YGUPCM*YA(I)+0.5))
  9207. 1220        CONTINUE
  9208.     RETURN
  9209.     END
  9210.  
  9211.  
  9212.     SUBROUTINE GD_VECTRIX_WORD(INT)
  9213.     INTEGER*2 INT
  9214. C
  9215.     CALL GB_INSERT(INT)
  9216.     CALL GB_INSERT(INT/256)
  9217.     RETURN
  9218.     END
  9219.     SUBROUTINE GDWAIT(MILLISECONDS)
  9220. C
  9221. C    THIS SUBROUTINE DELAYS A GIVEN NUMBER OF MILLISECONDS.
  9222. C
  9223.     INTEGER*4 SYS$SETIMR,SYS$WAITFR
  9224. C
  9225.     INTEGER*4 DELTIME(2)
  9226. C
  9227.     DELTIME(1) = -MILLISECONDS*10000 !10,000 (100ns) UNITS PER MILLISEC.
  9228.     DELTIME(2) = -1
  9229.     ISTAT = SYS$SETIMR(%VAL(1),DELTIME, , )
  9230.     IF (.NOT. ISTAT) STOP 'SET TIME FAILURE'
  9231.     ISTAT = SYS$WAITFR(%VAL(1))
  9232.     IF (.NOT. ISTAT) STOP 'WAITFOR FAILURE'
  9233.     RETURN
  9234.     END
  9235. This code is completely untested!!!!!
  9236.     SUBROUTINE GDZETA8TALL(IFXN,XA,YA)
  9237.     DIMENSION XA(8), YA(3)
  9238. C
  9239. C    DIGLIB ZETA 8 GRAPHICS DEVICE DRIVER
  9240. C     USES THE ZETA "FUNDAMENTAL PLOTTING SUBROUTINES"
  9241. C
  9242. C-----------------------------------------------------------------------
  9243. C
  9244.     DIMENSION DCHAR(8)
  9245.     LOGICAL*2 LWIDE
  9246. C
  9247. C    THE ZETA 8 IS ASSUMED TO BE SET FOR RESOLUTION OF 0.025 mm
  9248. C    DIGLIB ASSUMES 8.5 INCH FAN FOLD PAPER.   DIGLIB USES A PLOTTING
  9249. C     SURFACE OF 8X10 INCHES, WITH EQUAL 0.25 INCH BORDERS IN THE X
  9250. C     DIRECTION, A BOTTOM BORDER OF 0.25 INCH, AND A TOP BORDER OF
  9251. C     0.75 INCH.   THUS THE DIGLIB PLOTTING SURFACE OF 8X10 IS PLACED
  9252. C     NICELY ON 8.5X11.0 INCH PAPER.
  9253. C    THIS DIGLIB DRIVER PROVIDES AN ALTERNATE ENTRY POINT FOR ROTATING
  9254. C     THE PLOT 90 DEGREES WHEN THE USER WANTS A PLOT THAT IS WIDER THAN
  9255. C     IT IS TALL.   THE ENTRY POINT NAME IS "GDZETA8WIDE".   THE SAME
  9256. C     BOTTOM AND LEFT BORDERS ARE USED.
  9257. C
  9258.     PARAMETER (CM_PER_INCH = 2.54)
  9259. C-----------------------------------------------------------------------
  9260. C
  9261. C PAPER DEFINITIONS - ALL IN INCHES
  9262. C
  9263.     PARAMETER (PAPER_WIDTH = 8.5)    !PAPER FAN FOLD WIDTH
  9264.     PARAMETER (PAPER_HEIGHT = 11.0)    !PAPER HEIGHT
  9265.     PARAMETER (LEFT_BORDER = 0.25)    !LEFT SIDE BORDER
  9266.     PARAMETER (BOTTOM_BORDER = 0.25)!BOTTOM OF PAPER BORDER
  9267.     PARAMETER (PLOT_WIDTH = 8.0)    !WIDTH OF PAPER USED FOR PLOTTING
  9268.     PARAMETER (PLOT_HEIGHT = 11.0)    !HEIGHT OF PAPER USE FOR PLOTTING
  9269. C
  9270. C PLOTTER DEFINITIONS - ALL IN CENTIMETERS
  9271. C
  9272.     PARAMETER (RESOLUTION = 0.0025)    !RESOLUTION
  9273.     PARAMETER (PEN_WIDTH = 0.002)    !PEN LINE WIDTH
  9274. C
  9275. C***********************************************************************
  9276. C
  9277. C CALCULATED QUANTITIES FOR PLOTTER
  9278. C
  9279.     PARAMETER (X_WIDE = CM_PER_INCH*PLOT_WIDTH)
  9280.     PARAMETER (Y_HIGH = CM_PER_INCH*PLOT_HEIGHT)
  9281.     PARAMETER (SKIPPED_LINES = PEN_WIDTH/RESOLUTION)
  9282. C
  9283. C***********************************************************************
  9284. C
  9285.     DATA DCHAR /8.0, X_WIDE, Y_HIGH, RESOLUTION, RESOLUTION,
  9286.     1   7.0, 3.0, SKIPPED_LINES/
  9287. C
  9288. C    SHOW WE WANT TALL NOT WIDE PLOTTING AREA
  9289. C
  9290.     LWIDE = .FALSE.
  9291. 10    CONTINUE
  9292. C
  9293. C    FIRST VERIFY WE GOT A GRAPHICS FUNCTION WE CAN HANDLE
  9294. C
  9295.     IF (IFXN .LE. 0 .OR. IFXN .GT. 8) RETURN
  9296. C
  9297. C    NOW DISPATCH TO THE PROPER CODE TO HANDLE THAT FUNCTION
  9298. C
  9299.     GO TO (100,200,300,400,500,600,700,800) IFXN
  9300. C
  9301. C    *********************
  9302. C    INITIALIZE THE DEVICE
  9303. C    *********************
  9304. C
  9305. 100    CONTINUE
  9306. ???    CALL PLOTS(53,0,4)
  9307.     YA(1) = 0.0
  9308.     RETURN
  9309. C
  9310. C    **************************
  9311. C    GET FRESH PLOTTING SURFACE
  9312. C    **************************
  9313. C
  9314. 200    CONTINUE
  9315.     CALL NEWPEN(1)
  9316.     CALL PLOT(PAPER_WIDTH,0.0,-3)
  9317.     RETURN
  9318. C
  9319. C    ****
  9320. C    MOVE
  9321. C    ****
  9322. C
  9323. 300    CONTINUE
  9324.     IPEN = +3
  9325.     GO TO 450
  9326. C
  9327. C    ****
  9328. C    DRAW
  9329. C    ****
  9330. C
  9331. 400    CONTINUE
  9332.     IPEN = +2
  9333. 450    CONTINUE
  9334. C
  9335. C    ZETA "PLOT" SUBROUTINE WANTS INCHES, SO CONVERT
  9336. C
  9337.     X = XA(1)/CM_PER_INCH
  9338.     Y = YA(1)/CM_PER_INCH
  9339.     IF (LWIDE) THEN
  9340.         CALL PLOT(LEFT_BORDER+PLOT_WIDTH-Y,BOTTOM_BORDER+X,IPEN)
  9341.         ELSE
  9342.         CALL PLOT(LEFT_BORDER+X,BOTTOM_BORDER+Y,IPEN)
  9343.     END IF
  9344.     RETURN
  9345. C
  9346. C    *****************************
  9347. C    FLUSH GRAPHICS COMMAND BUFFER
  9348. C    *****************************
  9349. C
  9350. 500    CONTINUE
  9351. C
  9352. C    NOP FOR ZETA 8 CAUSE I DON'T KNOW HOW TO MAKE THE FUNDAMENTAL
  9353. C     PLOTTING ROUTINES DO IT
  9354. C
  9355.     RETURN
  9356. C
  9357. C    ******************
  9358. C    RELEASE THE DEVICE
  9359. C    ******************
  9360. C
  9361. 600    CONTINUE
  9362.     CALL PLOT(PAPER_WIDTH, 0.0, +999)
  9363.     RETURN
  9364. C
  9365. C    *****************************
  9366. C    RETURN DEVICE CHARACTERISTICS
  9367. C    *****************************
  9368. C
  9369. 700    CONTINUE
  9370.     DO 720 I=1,8
  9371.     XA(I) = DCHAR(I)
  9372. 720    CONTINUE
  9373.     IF (.NOT. LWIDE) RETURN
  9374.     XA(2) = DCHAR(3)
  9375.     XA(3) = DCHAR(2)
  9376.     RETURN
  9377. C
  9378. C    SELECT NEW COLOR
  9379. C
  9380. 800    CONTINUE
  9381.     CALL NEWPEN(INT(XA(1))
  9382.     RETURN
  9383. C
  9384. C    ALTERNATE ENTRY FOR WIDE PLOTTING AREA
  9385. C
  9386.     ENTRY GDZETA8WIDE(IFXN,XA,YA)
  9387.     LWIDE = .TRUE.
  9388.     GO TO 10
  9389.     END
  9390.