File: ACDriver

package info (click to toggle)
pgplot5 5.2.2-19.3
  • links: PTS
  • area: non-free
  • in suites: buster, stretch
  • size: 7,136 kB
  • ctags: 6,763
  • sloc: fortran: 39,792; ansic: 22,549; objc: 1,534; sh: 1,298; makefile: 385; perl: 234; pascal: 233; tcl: 190; awk: 51; csh: 25
file content (640 lines) | stat: -rw-r--r-- 19,664 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
C*ACDRIV -- PGPLOT device driver for Acorn Archimedes machines
C+
      SUBROUTINE ACDRIV (IFUNC, RBUF, NBUF, CHR, LCHR, MTYPE)
      INTEGER IFUNC, NBUF, LCHR, MTYPE
      REAL    RBUF(*)
      CHARACTER*(*) CHR, DEFNAM
C
C PGPLOT driver for Acorn Archimedes
C This driver will cause the system to leave the Desktop, but leave the 
C screen mode provided it has the normal 16 colours
C
C This routine must be compiled with Acorn Fortran release 2
C and linked with the Fortran Friends graphics, utils and spriteop libraries.
C
C 26 January 1996 : Version 1.10
C 16 May 1996     : Version 1.11 allows concurrent /ARCF and ARCV
C
C Resolution: Depends on graphics mode. Ensure that the current mode is
C suitable before running the PGPLOT program.
C
C version 1.10 also allows the making of the pictures into sprite files
C the default sprite size is the screen size but you may alter the
C number of pixels in x and y with the variables:
C PGPLOT_ARC_WIDTH and PGPLOT_ARC_HEIGHT
C the file names will be sprite/01, sprite/02 etc.
      PARAMETER (DEFNAM = 'sprite/01')
C
C 26 April 1996 : Version 1.11 (changes to /ARCV)
C               - small corrections to the initial screen clearing
C               - allows standard PGPLOT rubber-banded cursors
C---
C             common for communicating with rubber banding GRARC3
      COMMON /GRARCC/ MAXX(2), MAXY(2), I4X0, I4Y0, I4X1, I4Y1, I4MODE
      INTEGER         MAXX,    MAXY,    I4X0, I4Y0, I4X1, I4Y1, I4MODE
C
      INTEGER NXPIX(2), NYPIX(2), MULTX(2), MULTY(2), IXSTEP(2)
      SAVE    NXPIX,    NYPIX,    MULTX,    MULTY,    IXSTEP
      INTEGER NCOLR, NEEDSP, KOLNOW(2), KOLOUR(0:255)
      SAVE    NCOLR, NEEDSP, KOLNOW,    KOLOUR
      LOGICAL INIT, APPEND, FIRSTO, INPICT(2), STATE(2)
      SAVE    INIT, APPEND, FIRSTO, INPICT, STATE
      INTEGER IERR, I4X2, I4Y2, MBUF(2), IREGS(0:9), ISCRR(4)
      LOGICAL SWIERR, SWIF77, SPOP08, SPOP15, LOGDUM
      CHARACTER ANS*4, INSTR*10, SPNAME*9
      DATA    INIT/.TRUE./, STATE/2*.FALSE./
      DATA    KOLOUR/?I00000000, ?IFFFFFF00, ?I0000FF00, ?I00FF0000,
     1               ?IFF000000, ?IFFFF0000, ?IFF00FF00, ?I00FFFF00,
     2               ?I0080FF00, ?I00FF8000, ?I80FF0000, ?IFF800000,
     3               ?IFF008000, ?I8000FF00, ?I50505000, ?IA0A0A000,
     4                240*0/
      IF(INIT .AND. IFUNC.GT.1) THEN
C            check for 16-colour mode
        NCOLR = MODEVAR(-1, 3)
        IF(NCOLR.EQ.63) NCOLR = 255
        IF(NCOLR.EQ.-1) NCOLR = ?IFFFFFF
        IF(NCOLR.LT.15) THEN
        CALL GRWARN('Archimedes driver needs at least 16 colours')
          NBUF = -1
          RETURN
        ENDIF
        INIT = .FALSE.
C           get screen characteristics
        DO 8 MTP = 1, 2
          NXPIX(MTP) = MODEVAR(-1, 11) + 1
          NYPIX(MTP) = MODEVAR(-1, 12) + 1
          IF(MTP.EQ.1) THEN
            MULTX(1) = MODEVAR(-1, 4)
            MULTY(1) = MODEVAR(-1, 5)
          ELSE
            SPNAME = DEFNAM
            CALL GRGENV('ARC_WIDTH', INSTR, L)
            IF(L.GT.0) READ(INSTR, 4)NXPIX(2)
    4       FORMAT(BN, I10)
            CALL GRGENV('ARC_HEIGHT', INSTR, L)
            IF(L.GT.0) READ(INSTR, 4)NYPIX(2)
            MULTX(2) = 1
            MULTY(2) = 1
          ENDIF
          IXSTEP(MTP) = ISHFT(1, MULTX(MTP))
          MAXX(MTP) = ISHFT(NXPIX(MTP), MULTX(MTP))
          MAXY(MTP) = ISHFT(NYPIX(MTP), MULTY(MTP))
          INPICT(MTP) = .FALSE.
    8   CONTINUE
      ENDIF
      IF(IFUNC.GT.9 .AND. .NOT.STATE(MTYPE)) THEN
        CALL GRWARN('Device is not open')
        NBUF = -1
        RETURN
      ENDIF
      GOTO( 10, 20, 30, 40, 50, 60, 70, 80, 90,100,
     1     110,120,130,140,150,160,170,180,190,200,
     2     210,220,230,240,250,260,270,280,290) IFUNC
C            unknown driver function, so just return
      NBUF = -1
      RETURN
C
C--- IFUNC = 1, Return device name.-------------------------------------
C
   10 IF(MTYPE.EQ.1) THEN
        CHR = 'ARCV (screen viewer for Acorn Archimedes machines)'
        LCHR = LNBLNK(CHR)
      ELSEIF(MTYPE.EQ.2) THEN
        CHR = 'ARCF (sprite file for Acorn Archimedes machines)'
        LCHR = LNBLNK(CHR)
      ELSE
        CALL GRWARN('Requested MODE not implemented in Archi driver')
        LCHR = 0
        NBUF = -1
      ENDIF
      RETURN
C
C--- IFUNC = 2, Return physical min and max for plot device, and range
C               of color indices.---------------------------------------
C
   20 CONTINUE
      RBUF(1) = 0
      RBUF(2) = MAXX(MTYPE)
      RBUF(3) = 0
      RBUF(4) = MAXY(MTYPE)
      RBUF(5) = 0
      RBUF(6) = MIN(255, NCOLR)
      NBUF = 6
      RETURN
C
C--- IFUNC = 3, Return device resolution. ------------------------------
C Divide the number of pixels on screen by a typical screen size in
C inches.
C
   30 continue
      RBUF(1) = MAXX(MTYPE)/10.0
      RBUF(2) = RBUF(1)
      RBUF(3) = FLOAT(ISHFT(1, MULTX(MTYPE)))
      NBUF = 3
      RETURN
C
C--- IFUNC = 4, Return misc device info. -------------------------------
C    (This device is Interactive, cursor, No dashed lines, No area fill,
C    No thick lines, rectangle fill)
C
   40 IF(MTYPE.EQ.1) THEN
        CHR = 'ICNNNRPVYN'
      ELSE
        CHR = 'HNNNNRPNYN'
      ENDIF
      LCHR = 10
      NBUF = 0
      RETURN
C
C--- IFUNC = 5, Return default file name. ------------------------------
C
   50 IF(MTYPE.EQ.1) THEN
        CHR = ' '
        LCHR = 1
      ELSE
        CHR = SPNAME
        LCHR = 9
      ENDIF
      RETURN
C
C--- IFUNC = 6, Return default physical size of plot. ------------------
C
   60 CONTINUE
      RBUF(1) = 0
      RBUF(2) = MAXX(MTYPE)
      RBUF(3) = 0
      RBUF(4) = MAXY(MTYPE)
      NBUF = 4
      RETURN
C
C--- IFUNC = 7, Return misc defaults. ----------------------------------
C
   70 RBUF(1) = 1
      NBUF = 1
      RETURN
C
C--- IFUNC = 8, Select plot. -------------------------------------------
C
   80 CONTINUE
      RETURN
C
C--- IFUNC = 9, Open workstation. --------------------------------------
C
   90 CONTINUE
C     -- check for concurrent access
      IF (STATE(MTYPE)) THEN
        CALL GRWARN('Device is already open')
        RBUF(2) = 0
      ELSE
        IF(MTYPE.EQ.1) THEN
C         flag to erase screen on next picture
          FIRSTO = .TRUE.
C         set append flag to suppress screen clearing on subsequent pictures
          APPEND = RBUF(3).NE.0.
        ENDIF
C         flag the workstation active
        STATE(MTYPE) = .TRUE.
C         but not generating picture yet
        INPICT(MTYPE) = .FALSE.
C
        RBUF(2) = 1
      END IF
      RBUF(1) = 0
      NBUF = 2
      RETURN
C
C--- IFUNC = 10, Close workstation. ------------------------------------
C
  100 CONTINUE
C          flag the workstation inactive
      STATE(MTYPE) = .FALSE.
      IF(MTYPE.EQ.1) THEN
C          reset the 16 colour palette
        IF(NCOLR.EQ.15)  CALL VDU(20) 
C          clear the screen
        CALL CLS
      ENDIF
      RETURN
C
C--- IFUNC = 11, Begin picture. ----------------------------------------
C
  110 CONTINUE
      IF(MTYPE.EQ.1 .AND. (.NOT.APPEND .OR. FIRSTO)) THEN
        CALL GRARC2(0, 0, -NCOLR, KOLOUR)
C         remove viewports and clear screen to background colour
        CALL VDU(26)
        CALL CLG
C         home the text cursor
        CALL VDU(30)
C         set foreground text colour
        IF(NCOLR.EQ.15) CALL COLOUR(1)
C         remove pointer
        CALL OSCLI('Pointer 0')
      ENDIF
      FIRSTO = .FALSE.
      IERR=0
      IF(MTYPE.EQ.2) THEN
C          create sprite
        LBPPIX = MODEVAR(-1, 9)
        NBYTES = ISHFT(NXPIX(2)*NYPIX(2), LBPPIX)/8 + 64
C            first ensure there is space in system sprite area
        IF(.NOT.SPOP08(0, ISPSIZ, NSPRIT, ISPR1, IFREE)) THEN
C         case 1, no system sprite area yet
          NEEDSP = NBYTES + 16 + 44
        ELSE
C         case 2, system sprite area exists
C         remove any of our sprites which may have been left by accident
  112     DO 114 ISPRIT = 1, NSPRIT
            CALL SPOP13(0, ISPRIT, INSTR,LENG)
            IF(INSTR(1:7).EQ.'sprite/'.AND.LENG.EQ.9) THEN
              CALL SPOP25(0, INSTR(1:9))
              NSPRIT = NSPRIT -1
              GO TO 112
            ENDIF
  114     CONTINUE
          LOGDUM = SPOP08(0, ISPSIZ, NSPRIT, ISPR1, IFREE)
          NEEDSP = NBYTES + 44 - ISPSIZ + IFREE
        ENDIF
        IERR = 0
        IF(NEEDSP.GT.0) THEN
          IREGS(0) = 3
          IREGS(1) = NEEDSP
          IF(SWIF77(?I2A, IREGS, IFLAG)) IERR = 100
          IF(IERR.EQ.0) THEN
            IF(IREGS(1).GE.NEEDSP) THEN
C              successfully assigned memory
              NEEDSP = IREGS(1)
            ELSE
              IERR = 101
            ENDIF
          ENDIF
        ENDIF
C            create sprite      
        IF(IERR.EQ.0) THEN
          IF(NCOLR.EQ.15) THEN
C                       create it with palette in 16 colour mode
            SWIERR = SPOP15(0, SPNAME, 1, NXPIX(2), NYPIX(2), 27)
          ELSEIF(NCOLR.EQ.255) THEN
            SWIERR = SPOP15(0, SPNAME, 0, NXPIX(2), NYPIX(2), 28)
          ELSE
C             create sprite 'mode word' (PRM 5-87)
            MODEW = IOR(?I1680B5, ISHFT(LBPPIX + 1, 27))
            SWIERR = SPOP15(0, SPNAME, 0, NXPIX(2), NYPIX(2), MODEW)
          ENDIF
          IF(SWIERR) IERR = 103
          IF(IERR.EQ.0) CALL GRWARN('creating sprite '//SPNAME)
        ENDIF
        IF(IERR.NE.0) THEN
          CALL GRGMSG(IERR)
          CALL GRWARN('Failed to allocate plot buffer.')
C              failed to get enough memory so return it 
          IF(IERR.GT.100) THEN
            IREGS(1) = -IREGS(1)
            IF(SWIF77(?I2A, IREGS, IFLAG)) THEN
              IERR = 101
            ELSE
              IERR = 102
            ENDIF
          ENDIF
        ENDIF
      ENDIF
C            set up colours
      IF(IERR.EQ.0) THEN
        IF(NCOLR.EQ.15) THEN
          DO 118 I = 0, 15
            IF(MTYPE.EQ.2) THEN
              CALL GRARC1(SPNAME, I, KOLOUR(I))
            ELSE
              CALL VDU19(I, 16, 
     1        IAND(ISHFT(KOLOUR(I), -8), 255),
     2        IAND(ISHFT(KOLOUR(I), -16), 255),
     3        ISHFT(KOLOUR(I), -24))
            ENDIF
  118     CONTINUE
        ELSEIF(MTYPE.EQ.2) THEN
C             clear 255 colour sprite to background colour
          CALL SPOP60(0, SPNAME, 0, ISCRR)
          CALL GRARC2(0, 0, -NCOLR, KOLOUR)
          CALL CLG
          CALL NPOP60(ISCRR)
        ENDIF
      ENDIF
      IF(IERR.EQ.0) INPICT(MTYPE) = .TRUE.
      RETURN
C
C--- IFUNC = 12, Draw line. --------------------------------------------
C
  120 CONTINUE
      IF(INPICT(MTYPE)) THEN
        IF(MTYPE.EQ.2) CALL SPOP60(0, SPNAME, 0, ISCRR)
        CALL GRARC2(0, KOLNOW(MTYPE), NCOLR, KOLOUR)
        CALL LINE(NINT(RBUF(1)), NINT(RBUF(2)),
     1            NINT(RBUF(3)), NINT(RBUF(4)))
        IF(MTYPE.EQ.2) CALL NPOP60(ISCRR)
      ENDIF
      RETURN
C
C--- IFUNC = 13, Draw dot. ---------------------------------------------
C
  130 CONTINUE
      IF(INPICT(MTYPE)) THEN
        IF(MTYPE.EQ.2) CALL SPOP60(0, SPNAME, 0, ISCRR)
        CALL GRARC2(0, KOLNOW(MTYPE), NCOLR, KOLOUR)
        CALL SPOT(NINT(RBUF(1)), NINT(RBUF(2)))
        IF(MTYPE.EQ.2) CALL NPOP60(ISCRR)
      ENDIF
      RETURN
C
C--- IFUNC = 14, End picture. ------------------------------------------
C
  140 CONTINUE
      IF(INPICT(MTYPE).AND.MTYPE.EQ.2) THEN
C              write out sprite
        CALL SPOP12(0, SPNAME)
C              delete sprite
        CALL SPOP25(0, SPNAME)
C              update sprite name
        I = ICHAR(SPNAME(9:9)) + 1
        IF(I.LT.58) THEN
          SPNAME(9:9) = CHAR(I)
        ELSE
          SPNAME(8:9) = CHAR(ICHAR(SPNAME(8:8)) + 1)//'0'
        ENDIF
C                give back memory
        IF(NEEDSP.GT.0) THEN
          IREGS(0) = 3
          IREGS(1) = -NEEDSP
          IF(SWIF77(?I2A, IREGS, IFLAG)) THEN
            CALL GRGMSG(104)
            CALL GRWARN('Failed to deallocate plot buffer.')
          ENDIF
        ENDIF
      ENDIF
      INPICT(MTYPE) = .FALSE.
      RETURN
C
C--- IFUNC = 15, Select color index. -----------------------------------
  150 CONTINUE
      KOLNOW(MTYPE) = NINT(RBUF(1))
      RETURN
C
C--- IFUNC = 16, Flush buffer. -----------------------------------------
C
  160 CONTINUE
      RETURN
C
C--- IFUNC = 17, Read cursor. ------------------------------------------
C
  170 CONTINUE
      IF(MTYPE.EQ.2) RETURN
C             display pointer
      CALL OSCLI('Pointer')
C             wait until button(s) and keys are released
  172 CALL MOUSE(I4X0, I4Y0, I4B)
      IF(I4B.NE.0 .OR. INKEY(0).GT.0) GO TO 172
C             move to desired place
      I4X0 = NINT(RBUF(1))
      I4Y0 = NINT(RBUF(2))
      MBUF(1) = 5 + IOR(ISHFT(I4X0, 8), ISHFT(I4Y0, 24))
      MBUF(2) = ISHFT(I4Y0, -8)
      CALL OSWORD(21, MBUF)
C             anchor position
      I4X1 = NINT(RBUF(3))
      I4Y1 = NINT(RBUF(4))
C             band mode
      I4MODE = NINT(RBUF(5))
C             initial band
      IF(I4MODE.GT.0) THEN
C             set colour of banding
        CALL GRARC2(3, KOLNOW(MTYPE), NCOLR, KOLOUR)
        CALL GRARC3
      ENDIF
C             loop and wait for keystroke/button click
  174 CONTINUE
C             get mouse pointer status
      CALL MOUSE(I4X2, I4Y2, I4B)
C             check for key press
      KEY = INKEY(0)
C             'select' = 'A'
      IF(I4B.EQ.4) KEY = 65
C             'menu'   = 'D'
      IF(I4B.EQ.2) KEY = 68
C             'adjust' = 'X'
      IF(I4B.EQ.1) KEY = 88
      IF(I4MODE.GT.0) THEN
        IF(I4X2.NE.I4X0 .OR. I4Y2.NE.I4Y0) THEN
C            wait for frame scan
          CALL OSBYTE(19,0,0)
C            clear the old band
          CALL GRARC3
C            move the band
          I4X0 = I4X2
          I4Y0 = I4Y2
C            draw the new band
          CALL GRARC3
        ENDIF
      ENDIF
      IF(KEY.LE.0) GO TO 174
C             erase final band
      IF(I4MODE.GT.0) CALL GRARC3
C             return current position
      RBUF(1) = FLOAT(I4X2)
      RBUF(2) = FLOAT(I4Y2)
      NBUF = 2
C             and character
      CHR(1:1)  = CHAR(KEY)
      LCHR = 1
      RETURN
C
C--- IFUNC = 18, Erase alpha screen. -----------------------------------
C
  180 CONTINUE
      RETURN
C
C--- IFUNC = 19, Set line style. ---------------------------------------
C
  190 CONTINUE
      RETURN
C
C--- IFUNC = 20, Polygon fill. -----------------------------------------
C
  200 CONTINUE
      RETURN
C
C--- IFUNC = 21, Set color representation. -----------------------------
C
  210 CONTINUE
      ICOL = NINT(RBUF(1))
      IRED = NINT(RBUF(2)*255.)
      IGRN = NINT(RBUF(3)*255.)
      IBLU = NINT(RBUF(4)*255.)
      KOLOUR(ICOL) = ISHFT(IBLU, 24) + ISHFT(IGRN, 16) + ISHFT(IRED, 8)
      IF(NCOLR.EQ.15.AND.INPICT(MTYPE)) THEN
        IF(MTYPE.EQ.2) THEN
          CALL GRARC1(SPNAME, ICOL, KOLOUR(ICOL))
        ELSE 
          CALL VDU19(ICOL, 16, IRED, IGRN, IBLU)
        ENDIF
      ENDIF
      RETURN
C
C--- IFUNC = 22, Set line width. ---------------------------------------
C
  220 CONTINUE
      RETURN
C
C--- IFUNC = 23, Escape. -----------------------------------------------
C
  230 CONTINUE
      RETURN
C
C--- IFUNC = 24, Rectangle fill. ---------------------------------------
C
  240 CONTINUE
      IF(INPICT(MTYPE)) THEN
        IF(MTYPE.EQ.2) CALL SPOP60(0, SPNAME, 0, ISCRR)
        CALL GRARC2(0, KOLNOW(MTYPE), NCOLR, KOLOUR)
        CALL RECTAN(NINT(RBUF(1)), NINT(RBUF(2)),
     1              NINT(RBUF(3)), NINT(RBUF(4)), .TRUE.)
        IF(MTYPE.EQ.2) CALL NPOP60(ISCRR)
      ENDIF
      RETURN
C
C--- IFUNC = 25, Set fill pattern. -------------------------------------
C
  250 CONTINUE
      RETURN
C
C--- IFUNC = 26, Line of pixels. ---------------------------------------
C
  260 CONTINUE
      IF(.NOT.INPICT(MTYPE)) RETURN
      IF(MTYPE.EQ.2) CALL SPOP60(0, SPNAME, 0, ISCRR)
      IX = NINT(RBUF(1))
      IY = NINT(RBUF(2))
      K1 = NINT(RBUF(3))
      IX1 = IX
      DO 264 I = 3 + IXSTEP(MTYPE), NBUF, IXSTEP(MTYPE)
        K2 = NINT(RBUF(I))
        IF(K1.NE.K2) THEN
          CALL GRARC2(0, K1, NCOLR, KOLOUR)
          IF(IX.EQ.IX1) THEN
            CALL SPOT(IX, IY)
          ELSE
            CALL LINE(IX1, IY, IX, IY)
          ENDIF
          K1 = K2
          IX1 = IX + IXSTEP(MTYPE)
        ENDIF
        IX = IX + IXSTEP(MTYPE)
  264 CONTINUE
      CALL GRARC2(0, K2, NCOLR, KOLOUR)
      IF(IX.EQ.IX1) THEN
        CALL SPOT(IX, IY)
      ELSE
        CALL LINE(IX1, IY, IX, IY)
      ENDIF
      IF(MTYPE.EQ.2) CALL NPOP60(ISCRR)
      RETURN
C
C--- IFUNC = 27, Not implemented ---------------------------------------
C
  270 CONTINUE
      RETURN
C
C--- IFUNC = 28, Not implemented ---------------------------------------
C
  280 CONTINUE
      RETURN
C
C--- IFUNC = 29, Query color representation. ---------------------------
C
  290 CONTINUE
      I = RBUF(1)
      RBUF(2) = IAND(ISHFT(KOLOUR(I),  -8), 255)/255.0
      RBUF(3) = IAND(ISHFT(KOLOUR(I), -16), 255)/255.0
      RBUF(4) = IAND(ISHFT(KOLOUR(I), -24), 255)/255.0
      NBUF = 4
      RETURN
C-----------------------------------------------------------------------
      END
C
      SUBROUTINE GRARC1(SPNAME, I, KOL)
      DIMENSION IREGS(0:9)
      CHARACTER *(*) SPNAME, NAME*12
      EQUIVALENCE(IPP, IREGS(4))
      LOGICAL SWIF77
C           set sprite palette I to KOL (Only in RISC-OS 3)
      NAME = SPNAME
      L = LNBLNK(NAME)
      NAME(L+1:L+1) = CHAR(0)
      IREGS(0) = 37
      IREGS(1) = 0
      IREGS(2) = LOCC(NAME)
      IREGS(3) = -1
C          do SpriteOp 37
      IF(SWIF77(?I2E, IREGS, IFLAG))RETURN
      IF(IPP.EQ.0) RETURN
      IOFF = (IPP - LOC(IREGS))/4
C         address of palette is now IREGS(IOFF)
      KK = IOR(16, IAND(KOL, ?IFFFFFF00))
      IREGS(IOFF+I+I) = KK
      IREGS(IOFF+I+I+1) = KK
      RETURN
      END
C
      SUBROUTINE GRARC2(IACT, KOLNOW, NCOLR, KOLOUR)
C              set up currrent graphics colour and action
      DIMENSION IREGS(0:9), KOLOUR(0:255)
      IF(IABS(NCOLR).EQ.15) THEN
        IF(NCOLR.GT.0) THEN
          CALL GCOL(IACT, KOLNOW)
        ELSE
          CALL GCOL(IACT, KOLNOW + 128)
        ENDIF
      ELSE
        IREGS(0) = KOLOUR(KOLNOW)
        IREGS(3) = 0
        IF(NCOLR.LT.0) IREGS(3)=128
        IREGS(4) = IACT
C              do ColourTrans_SetGCOL
        CALL SWIF77(?I040743, IREGS, IFLAG)
      ENDIF
      RETURN
      END
C
      SUBROUTINE GRARC3
C             common for communicating with rubber banding GRARC3
      COMMON /GRARCC/ MAXX(2), MAXY(2), I4X0, I4Y0, I4X1, I4Y1, I4MODE
      INTEGER         MAXX,    MAXY,    I4X0, I4Y0, I4X1, I4Y1, I4MODE
C             only used for MTYPE=1, i.e. MAXX(1) and MAXY(1)
C
C             draw band of type I4MODE from (I4X1,I4Y1) to (I4X0,I4Y0)
C     I4MODE = 1: ordinary rubber band
C              2: rectangular box
C              3: horizontal lines
C              4: vertical lines
C              5: horizontal line through (I4X0,I4Y0) only
C              6: vertical line through (I4X0,I4Y0) only
C              7: vertical and horizontal lines through (I4X0,I4Y0) only
C
      GO TO (10, 20, 30, 40, 32, 42, 70), I4MODE
      RETURN
C               ordinary rubber band
   10 CALL LINE(I4X1, I4Y1, I4X0, I4Y0)
      RETURN
C               rectangular box
   20 CALL RECTAN(I4X1, I4Y1, I4X0, I4Y0, .FALSE.)
      RETURN
C               horizontal lines
   30 CALL LINE(0, I4Y1, MAXX, I4Y1)
   32 CALL LINE(0, I4Y0, MAXX, I4Y0)
      RETURN
C               vertical lines
   40 CALL LINE(I4X1, 0, I4X1, MAXY)
   42 CALL LINE(I4X0, 0, I4X0, MAXY)
      RETURN
C               vertical and horizontal lines through (I4X0,I4Y0) only
   70 CALL LINE(0, I4Y0, MAXX, I4Y0)
      GO TO 42
      END