1
C @(#)gd8aux.for 19.1 (ES0-DMD) 02/25/03 13:55:24
2
C===========================================================================
3
C Copyright (C) 1995 European Southern Observatory (ESO)
5
C This program is free software; you can redistribute it and/or
6
C modify it under the terms of the GNU General Public License as
7
C published by the Free Software Foundation; either version 2 of
8
C the License, or (at your option) any later version.
10
C This program is distributed in the hope that it will be useful,
11
C but WITHOUT ANY WARRANTY; without even the implied warranty of
12
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
C GNU General Public License for more details.
15
C You should have received a copy of the GNU General Public
16
C License along with this program; if not, write to the Free
17
C Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
20
C Corresponding concerning ESO-MIDAS should be addressed as follows:
21
C Internet e-mail: midas@eso.org
22
C Postal address: European Southern Observatory
23
C Data Management Division
24
C Karl-Schwarzschild-Strasse 2
25
C D 85748 Garching bei Muenchen
27
C===========================================================================
29
SUBROUTINE KKCTAB(SHAPE,COLOUR,CURSAR,IDST)
31
C = 2 - use table CROSSA.CUR (or CROSSC.CUR)
32
C = 3 - use table CROSSB.CUR (or CROSSD.CUR)
33
C = 4 - use table SQUARE.CUR [not implemented yet...]
34
C = 5 - use table DIAMOND.CUR [not implemented yet...]
35
C = 6 - use table CIRCLE.CUR
36
C = 7 - use table ARROW.CUR
37
C = 8 - use table SMALL.CUR (small xhair)
38
C = 0 - use table stored in keyword IN_A
42
INTEGER*4 SHAPE,COLOUR,IDST
44
INTEGER*4 NCOLS,NROWS,N
45
INTEGER*4 TABCOLNUM,TID
46
INTEGER*4 E_C,E_D,E_L,LTAB
47
INTEGER*4 KUNIT(1),NULLO
51
CHARACTER TABLEFILE*60,FILE*80
52
CHARACTER TABUNIT*16,MYLABEL*16
56
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
58
DATA MYLABEL /'CURSOR '/
61
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
66
C check, if we already loaded that last time ...
67
IF ( (OLDSHAPE.EQ.SHAPE) .AND. (COLOUR.NE.99) ) RETURN
71
TABLEFILE(1:) = 'crossb.cur '
72
IF (COLOUR.EQ.1) TABLEFILE(6:6) = 'd'
74
ELSE IF (SHAPE.EQ.4) THEN
75
TABLEFILE(1:) = 'square.cur '
77
ELSE IF (SHAPE.EQ.5) THEN
78
TABLEFILE(1:) = 'diamond.cur '
80
ELSE IF (SHAPE.EQ.6) THEN
81
TABLEFILE(1:) = 'circle.cur '
83
ELSE IF (SHAPE.EQ.7) THEN
84
TABLEFILE(1:) = 'arrow.cur '
86
ELSE IF (SHAPE.EQ.8) THEN
87
TABLEFILE(1:) = 'small.cur '
89
ELSE IF (SHAPE.EQ.0) THEN
90
CALL STKRDC('IN_A',1,1,60,N,TABLEFILE,KUNIT,NULLO,IDST)
91
N = INDEX(TABLEFILE,' ')
92
TABLEFILE(N:) = '.cur '
94
ELSE !default is cross
95
TABLEFILE(1:) = 'crossa.cur '
96
IF (COLOUR.EQ.1) TABLEFILE(6:6) = 'c'
99
C first look for system table, then for own table
100
FILE(1:) = 'MID_SYSTAB:'//TABLEFILE
101
CALL STECNT('GET',E_C,E_L,E_D)
102
CALL STECNT('PUT',1,0,0)
103
CALL TBTOPN(FILE,F_I_MODE,TID,IDST)
104
CALL STECNT('PUT',E_C,E_L,E_D)
108
CALL TBTOPN(FILE,F_I_MODE,TID,IDST)
115
C get info about table
116
CALL TBIGET(TID,NCOLS,NROWS,N,N,N,IDST)
117
CALL TBLSER(TID,MYLABEL,TABCOLNUM,IDST)
118
IF (TABCOLNUM.LE.0) THEN !incorrect columns...
123
C now read cursor table
125
CALL TBRRDI(TID,N,1,TABCOLNUM,CURSAR(N),TABNULL,IDST)
128
C release table file properly
129
CALL TBTCLO(TID,IDST)
134
SUBROUTINE TRKBAL(UNIT)
136
C++++++++++++++++++++++++++++++++++++++++++++++++++
139
C subroutine TRKBAL version 1.00 861120
140
C K. Banse ESO - Garching
143
C DeAnza unit, logical assignment
146
C init registers for use woth trackball
149
C according to DeAnza manual
152
C call as TRKBAL(UNIT)
155
C UNIT: I*2 DeAnza unit no.
158
C--------------------------------------------------
162
INTEGER*2 UNIT,TBGO,TMASK,NUL(4)
167
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
168
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
174
C clear status reg. + X,Y position registers
175
CALL IP8QW(LPR,UNIT,DZIOSB,,,NUL,8,0,0)
177
C set tracking mode + GO flag (bit 5) in TKB control register (reg. 1)
178
CALL IP8QW(LPR,UNIT,DZIOSB,,,TMASK,2,0,1) !enable both cursors
179
CALL IP8QW(LPR,UNIT,DZIOSB,,,TBGO,2,0,1) !as above, but also set but 5 to 1
184
SUBROUTINE BITS(IN,BIT)
186
C the word array BIT(16) is set to 0 or 1
187
C if the corresponding bit in word IN is set
192
DATA MASK /"1,"2,"4,"10,"20,"40,
193
+ "100,"200,"400,"1000,"2000,"4000,
194
+ "10000,"20000,"40000,"100000/
197
IF (IAND(MASK(N),IN).NE.0) THEN
207
SUBROUTINE KKGRA(DISPLAY,CHAN,STRING,LSTR,XPOS,YPOS,PATH,
208
+ ORIENT,INTENS,HT,IDST)
210
C++++++++++++++++++++++++++++++++++++++++++++++++++
213
C subroutine KKGRA version 1.00 880513
214
C K. Banse ESO - Garching
217
C DeAnza, overlay channel, alphabet
220
C support text plotting in the graphics memory
223
C characters are built in a 7*8 matrix (x:0-6, y:0-7)
224
C use IIGPLY to plot the stuff in the overlay plane
227
C call as KKGRA(DISPLAY,CHAN,STRING,LSTR,XPOS,YPOS,PATH,ORIENT,INTENS,HT,IDST)
230
C DISPLAY: I*4 unit no.
231
C CHAN: I*4 memory id
232
C STRING: char. expr. character string to be displayed
233
C LSTR: I*4 length of above
234
C XPOS: I*4 x-position
235
C YPOS: I*4 y-position
236
C PATH: I*4 text path:
237
C INTENS: I*4 intensity
238
C HT: I*4 text height, currently not supported
239
C characters are built in a 7*8 matrix
240
C or fixed in the alphanumerics memory
243
C IDST: I*4 return status
245
C--------------------------------------------------
249
INTEGER*4 DISPLAY,CHAN,LSTR,ORIENT
250
INTEGER*4 INTENS,XPOS,YPOS,PATH,HT,IDST
251
INTEGER*4 N,NN,NNN,MM
252
INTEGER*4 FCHARX(14),FCHARY(14)
253
INTEGER*4 XXPOS,YYPOS,IX,IY
259
INCLUDE 'MID_INCLUDE:DAZFONT.INC'
262
XXPOS = XPOS !save start coords.
265
C currently text path is always taken as = 0, (runs from left to right)
267
C compare each character with our alphabet
268
IF (ORIENT.EQ.0) THEN
271
IF (STRING(N:N).EQ.ALPHA(NN:NN)) THEN
273
MM = NN - 45 !take care of lowercase chars.
279
FCHARX(NNN) = ALPFIG(1,NNN,MM) + XXPOS
280
FCHARY(NNN) = ALPFIG(2,NNN,MM) + YYPOS
282
CALL GD8021(DISPLAY,CHAN,FCHARX,FCHARY,
283
+ ALPLEN(MM),INTENS,1,IDST)
286
XXPOS = XXPOS + 9 !move along the line ...
296
C compare each character with our alphabet
299
IF (STRING(N:N).EQ.ALPHA(NN:NN)) THEN
301
MM = NN - 45 !take care of lowercase
306
IX = ALPFIG(1,NNN,MM) + XXPOS - XPOS
307
IY = ALPFIG(2,NNN,MM) + YYPOS - YPOS
308
CALL ROTA(CA,SA,IX,IY,IX,IY)
309
FCHARX(NNN) = IX + XPOS
310
FCHARY(NNN) = IY + YPOS
312
CALL GD8021(DISPLAY,CHAN,FCHARX,FCHARY,
313
+ ALPLEN(MM),INTENS,1,IDST)
316
XXPOS = XXPOS + 9 !move along the line ...
325
SUBROUTINE KKALP(DISPLAY,STRING,LSTR,COL,LINE,MODE,IDST)
327
C++++++++++++++++++++++++++++++++++++++++++++++++++
330
C subroutine KKALP version 1.00 880120
331
C K. Banse ESO - Garching
334
C DeAnza, alphanumerics board
337
C support IIGTXT for alphanumerics memory
340
C use DeAnza level 0 software
343
C call as KKALP(DISPLAY,STRING,LSTR,COL,LINE,MODE,IDST)
346
C DISPLAY: I*4 display id.
347
C STRING: char.exp. string to be displayed
348
C LSTR: I*4 length of STRING
349
C COL: I*4 column number (0 - 79)
350
C LINE: I*4 line number (0 - 24)
351
C MODE: I*4 mode: 0,1,2,3 for white, yellow, etc.
354
C IDST: I*4 return status
357
C--------------------------------------------------
361
INTEGER*4 DISPLAY,LSTR,COL,LINE,MODE,IDST
364
INTEGER*2 UNIT,BYTSTR(80),MODBITS,RES
365
INTEGER*2 LAR,LPA,RR,LR
370
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
371
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
373
EXTERNAL LAR,LPA,RR,LR
375
DATA ALPHA(1:26) /'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
377
+ /'[\]^_ !"#$%& ()*+,-./0123456789'/
378
DATA ALPHA(58:63) /':;<=>?'/
379
DATA ALPHA(64:89) /'abcdefghijklmnopqrstuvwxyz'/
385
C make sure we work on low resolution
386
CALL IP8QW(RR,UNIT,DZIOSB,,,SYSREG(12),2,0,11) !reg. 11
387
RES = IAND(SYSREG(12),"177677) !force to low byte xfer
388
RES = IOR(RES,"100) !force to low byte xfer
389
CALL IP8QW(LR,UNIT,DZIOSB,,,RES,2,0,11)
391
C load address register (reg. 0) of alphanumerics board
392
N = (80 * LINE) + COL !a line has 80 chars.
393
CALL IP8QW(LAR,UNIT,DZIOSB,,,N,2,0,0) !CAP = 0 for A/N board
395
C shift MODE already into correct bit position
396
MODBITS = ISHFT(MODE,6)
398
C translate character string to A/N bytes
399
IF (LSTR.LT.1) RETURN
405
IF (STRING(N:N).EQ.ALPHA(NN:NN)) THEN
411
BYTSTR(N) = IOR(MM,MODBITS)
416
C send bytes to A/N board
417
CALL IP8QW(LPA,UNIT,DZIOSB,,,BYTSTR,2*LSTR,0,2) !A/N is group 2
419
C reset resolution in reg. 11
420
CALL IP8QW(LR,UNIT,DZIOSB,,,SYSREG(12),2,0,11) !reg. 11
425
SUBROUTINE JOYPSH(UNIT,PUSH,ISS)
427
C++++++++++++++++++++++++++++++++++++++++++++++++++
430
C subroutine JOYPSH version 1.00 861121
433
C K. Banse ESO - Garching
436
C DeAnza, joystick, trackball
439
C get status of joystick/trackball + cursor status
442
C use DeAnza level-0 software
445
C call as JOYPSH(UNIT,PUSH,ISS)
446
C TRKPSH(UNIT,PUSH,ISS)
449
C UNIT: I*2 DeAnza unit
452
C PUSH: I*4 = 1 for ENTER button pushed
456
C ISS: I*4 cursor bit mask on input
457
C cursor status: .NOT. 0 or 0
460
C 1.10 clear ENTER bit after the ENTER button has been pushed
461
C and EVSTAT returned properly
462
c for both JOYPSH + TRKPSH
464
C--------------------------------------------------
468
INTEGER*2 UNIT,ENTER,CONTROL
473
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
474
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
480
C read peripheral register
481
CALL IP8QW(RPR,UNIT,DZIOSB,,,CONTROL,2,0,1)
483
C 'AND' input mask with register
484
ISS = IAND(CONTROL,ISS)
486
C test, if something came in
487
IF (IAND(CONTROL,ENTER).NE.0) THEN
489
CALL IP8QW(LPR,UNIT,DZIOSB,,,1,2,0,1) !clear control reg.
497
SUBROUTINE TRKPSH(UNIT,PUSH,ISS)
502
INTEGER*2 IPR,EPUSH,EOFF,ETRACK,TMODE
505
INTEGER*4 PUSH,ISS,ISC1,ISC2
507
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
508
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
512
DATA EPUSH /'0001'O/ !mask for ENTER button
513
DATA EOFF /'7776'O/ !mask for complement of ENTER
514
DATA ETRACK /'0010'O/ !mask for TRACK/ON switch
516
C look at the TKB status register (reg. 0)
517
CALL IP8QW(RPR,UNIT,DZIOSB,,,IPR,2,0,0) !read peripheral register 0
519
C always extract cursor states
520
IF (IAND('40'O,IPR).NE.0) THEN
521
ISC1 = 1 !bit B6 = cursor 1 on/off
525
IF (IAND('20'O,IPR).NE.0) THEN !bit B5 = cursor 2 on/off
531
C if a cursor has been turned on/off, en/disable cursor tracking
532
TMODE = ISC1 + 2*ISC2
533
CALL IP8QW(LPR,UNIT,DZIOSB,,,TMODE,2,0,1)
534
TMODE = TMODE + '40'O !add the GO bit
535
CALL IP8QW(LPR,UNIT,DZIOSB,,,TMODE,2,0,1)
537
C check for push button or TRACK on
538
IF ( (IAND(ETRACK,IPR).NE.0) .OR.
539
+ (IAND(EPUSH,IPR).NE.0) ) THEN
541
IPR = IAND(IPR,EOFF) !clear the ENTER bit
542
CALL IP8QW(LPR,UNIT,DZIOSB,,,IPR,2,0,0) !and rewrite the control reg.
547
C set up return value for ISS
550
ELSE IF (ISS.EQ.1) THEN
559
SUBROUTINE TRKRD(UNIT,IX,IY)
561
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
564
C subroutine TRKRD version 1.00 861121
565
C K. Banse ESO - Garching
571
C to read the trackball displacements
574
C use the level-0 DeAnza routines
578
C call as TRKRD(UNIT,IX,IY)
581
C UNIT : I*2 DeAnza unit no.
584
C IX : I*4 X trackball displacement in [-128,+127]
585
C IY : I*4 Y joystick trackball displacement in [-128,+127]
587
C----------------------------------------------------------------------
591
INTEGER*2 UNIT,TPOS(2),TMODE
598
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
599
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
603
C poll TKB status register (reg. 0)
604
CALL IP8QW(RPR,UNIT,DZIOSB,,,IJR,2,0,0) !read reg 0
606
C always extract cursor states
607
IF (IAND('40'O,IJR).NE.0) THEN
608
IC1 = 1 !bit B6 = cursor 1 on/off
612
IF (IAND('20'O,IJR).NE.0) THEN !bit B5 = cursor 2 on/off
618
C if a cursor has been turned on/off, en/disable cursor tracking
620
CALL IP8QW(LPR,UNIT,DZIOSB,,,TMODE,2,0,1)
621
TMODE = TMODE + '40'O !add the GO bit
622
CALL IP8QW(LPR,UNIT,DZIOSB,,,TMODE,2,0,1)
625
CALL IP8QW(RPR,UNIT,DZIOSB,,,TPOS,4,0,2)
627
C take care of decrements...
628
IF (IAND('4000'O,TPOS(1)).NE.0)
629
+ TPOS(1) = IOR(TPOS(1),'170000'O)
630
IF (IAND('4000'O,TPOS(2)).NE.0)
631
+ TPOS(2) = IOR(TPOS(2),'170000'O)
633
C multiply by factor of 3 since trackball is so slow
634
TPOS(1) = 3 * TPOS(1)
635
TPOS(2) = 3 * TPOS(2)
637
IF (TPOS(1).LT.-128) THEN !force into [-128,127]
639
ELSE IF (TPOS(1).GT.127) THEN
644
IF (TPOS(2).LT.-128) THEN
646
ELSE IF (TPOS(2).GT.127) THEN
652
C and clear position registers again
655
CALL IP8QW(LPR,UNIT,DZIOSB,,,TPOS,4,0,2)
660
SUBROUTINE KKOWLT(UNIT,ISTA,COUNT,ROVT,IDST)
662
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
665
C subroutine KKOWLT version 1.00 880120
666
C K. Banse ESO - Garching
669
C DeAnza display , overlay table
672
C to load an overlay into the DeAnza,
675
C use DeAnza level 0 software
678
C call as KKOWLT(UNIT,ISTA,COUNT,ROVT,IDST)
682
C COUNT: I*4 no. of entries in table to send/read
685
C ROVT: R*4 array OVT table
686
C IDST: I*4 return status
688
C-----------------------------------------------------
692
INTEGER*4 ISTA,COUNT,IDST
697
INTEGER*2 UNIT,RESREG,OVT(1024)
698
INTEGER*2 RR,LR,LWA,LVR
700
INCLUDE 'MID_INCLUDE:DEANZAH.INC'
701
INCLUDE 'MID_INCLUDE:DEANZAS.INC'
703
EXTERNAL RR,LR,LWA,LVR
705
C set resolution register for low byte transfer
706
CALL IP8QW(RR,UNIT,DZIOSB,,,SYSREG(12),2,0,11)
707
RESREG = IOR(SYSREG(12),"100)
708
CALL IP8QW(LR,UNIT,DZIOSB,,,RESREG,2,0,11)
710
C set OVT LUT section (always = 0...) in LUT address register
711
VOCREG(4) = 0 !shift 9 bits left..
712
CALL IP8QW(LVR,UNIT,DZIOSB,,,VOCREG(4),2,0,3)
714
C convert real OVT table to I*2 and send it to the DeAnza
717
OVT(N) = NINT(ROVT(N)*255.)
720
CALL IP8QW(LWA,UNIT,DZIOSB,,,OVT,COUNT*2,0,1)
722
C reset the resolution register
723
CALL IP8QW(LR,UNIT,DZIOSB,,,SYSREG(12),2,0,11)