aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/display/iispio.x
blob: 81e2512d6ee77a4690eab5b166f7fe0b9cdd8e89 (plain) (blame)
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