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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <mach.h>
include <knet.h>
include "zdisplay.h"
include "iis.h"
# IISPIO -- Asynchronous pixel i/o to the IIS.
procedure iispio (buf, nx, ny)
short buf[nx,ny] # Cell array
int nx, ny # length, number of image lines
pointer iobuf
bool first_time
int xferid, status, nbytes, szline, i
int and()
include "iis.com"
data first_time /true/
begin
if (first_time) {
if (packit)
i = IIS_MAXBUFSIZE
else
i = IIS_MAXBUFSIZE * (SZ_SHORT * SZB_CHAR)
call malloc (iobuf, i, TY_SHORT)
first_time = false
}
# Wait for the last i/o transfer.
call iiswt (iischan, status)
if (status == ERR)
return
# Disable interrupts while transmitting to or receiving data from
# the display, to avoid loss of synch on the datastream and resulting
# loss of communications with the device.
call intr_disable()
xferid = XFERID(hdr)
# Transmit the packet header.
if (swap_bytes)
call bswap2 (hdr, 1, hdr, 1, SZB_IISHDR)
call zawrgd (iischan, hdr, SZB_IISHDR, 0)
call iiswt (iischan, status)
if (status == ERR) {
call intr_enable()
return
}
# Read or write the data block.
nbytes = ny * iis_xdim
szline = iis_xdim
if (packit)
szline = szline / (SZ_SHORT * SZB_CHAR)
else
nbytes = nbytes * (SZ_SHORT * SZB_CHAR)
# Transmit the data byte-packed to increase the i/o bandwith
# when using network i/o.
if (and (xferid, IREAD) != 0) {
# Read from the IIS.
call zardgd (iischan, Mems[iobuf], nbytes, 0)
call iiswt (iischan, status)
# Unpack and line flip the packed data.
if (packit) {
do i = 0, ny-1
call achtbs (Mems[iobuf+i*szline], buf[1,ny-i], iis_xdim)
} else {
do i = 0, ny-1
call amovs (Mems[iobuf+i*szline], buf[1,ny-i], szline)
}
} else {
# Write to the IIS.
# Bytepack the image lines, doing a line flip in the process.
if (packit) {
do i = 0, ny-1
call achtsb (buf[1,ny-i], Mems[iobuf+i*szline], iis_xdim)
} else {
do i = 0, ny-1
call amovs (buf[1,ny-i], Mems[iobuf+i*szline], szline)
}
call zawrgd (iischan, Mems[iobuf], nbytes, 0)
}
call intr_enable()
end
|