aboutsummaryrefslogtreecommitdiff
path: root/noao/mtlocal/idsmtn/rvarian.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/mtlocal/idsmtn/rvarian.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/mtlocal/idsmtn/rvarian.x')
-rw-r--r--noao/mtlocal/idsmtn/rvarian.x126
1 files changed, 126 insertions, 0 deletions
diff --git a/noao/mtlocal/idsmtn/rvarian.x b/noao/mtlocal/idsmtn/rvarian.x
new file mode 100644
index 00000000..ebfd7c4b
--- /dev/null
+++ b/noao/mtlocal/idsmtn/rvarian.x
@@ -0,0 +1,126 @@
+include <error.h>
+include <mach.h>
+include "idsmtn.h"
+
+# UNPK_VN_ID -- Unpack an ID string from an array of FORTH ascii characters,
+# one 7-bit character per byte. The first byte contains the character
+# count for the string.
+
+procedure unpk_vn_id (varian, offset, output_string)
+
+int varian[ARB] # Array with one byte per int
+int offset # Word offset to first character to be unpacked
+char output_string[SZ_IDS_ID] # Output array - one character per element
+
+pointer sp, id
+int nchars_id
+
+begin
+ call smark (sp)
+ nchars_id = min (varian[offset], SZ_IDS_ID-1)
+ call salloc (id, nchars_id, TY_CHAR)
+
+ call achtic (varian[offset+1], Memc[id], nchars_id)
+ call strcpy (Memc[id], output_string, nchars_id)
+
+ call sfree (sp)
+end
+
+
+# VN_RRAW -- Read Varian long (32-bit) integers from a packed bit array.
+# Raw pixels are written as Varian long integers. Each pixel is
+# 32-bits with bit 1 least significant, bit 16 unused and bit 32 the
+# sign bit. The bits are extracted and reassembled to form a real array of
+# IDS pixels, one pixel per array element.
+
+procedure vn_rraw (varian, offset, pixels, nwords)
+
+int varian[ARB] # Pointer to array of packed IDS record
+int offset # Word offset to first word to unpack
+real pixels[nwords] # Output array of unpacked IDS pixels
+int nwords # Number of values to unpack
+
+int ip, op, bytes[4], int_value
+
+include "lut.com"
+
+begin
+ ip = offset
+ for (op = 1; op <= nwords; op = op + 1) {
+
+ call amovi (varian[ip], bytes, 4)
+
+ if (bytes[1] < 127)
+ int_value = bytes[4] + (bytes[3] * (2 ** 8)) + (bytes[2] *
+ (2 ** 15)) + (bytes[1] * (2 ** 23))
+ else {
+ bytes[1] = neg_lut8[bytes[1]] * (2 ** 23)
+ bytes[2] = neg_lut8[bytes[2]] * (2 ** 15)
+ bytes[3] = neg_lut7[bytes[3]] * (2 ** 8)
+ bytes[4] = neg_lut8[bytes[4]]
+ int_value = -1 * (bytes[1] + bytes[2] + bytes[3] + bytes[4] + 1)
+ }
+
+ pixels[op] = real (int_value)
+ ip = ip + 4
+ }
+end
+
+
+# VN_RRED -- Read 32-bit floating point pixels from a packed bit array.
+# The values are written in special (Jan Schwitters) 2 word Varian floating
+# point. Reduced pixels are written in this format.
+
+procedure vn_rred (varian, offset, pixels, nwords)
+
+int varian[ARB] # Array of packed varian values
+int offset # Word offset to first value to unpack
+real pixels[nwords] # Output array of unpacked values
+int nwords # Number of values to unpack
+
+int ip, op, mantissa, exp, bytes[4]
+
+include "lut.com"
+include "powersof2.com"
+
+begin
+ ip = offset
+
+ do op = 1, nwords {
+
+ call amovi (varian[ip], bytes, 4)
+
+ if (mod (bytes[1], 2) == 0)
+ mantissa = bytes[4] + (bytes[3] * (2**8)) + (bytes[2] * (2**15))
+ else {
+ bytes[4] = neg_lut8[bytes[4]]
+ bytes[3] = neg_lut7[bytes[3]] * (2 ** 8)
+ bytes[2] = neg_lut8[bytes[2]] * (2 ** 15)
+ mantissa = -1 * (bytes[4] + bytes[3] + bytes[2] + 1)
+ }
+
+ # Divide out mantissa sign bit
+ exp = bytes[1]/2
+ if (bytes[1] > 127)
+ exp = -1 * (neg_lut6[exp] + 1)
+
+ # Reconstruct the floating point number as a SPP real. Powers of
+ # two are stored in the tbl[] array where 2 ** n = tbl[n + 129].
+ # The mantissa is divided by 2 ** 23 to move the binary point
+ # above bit 23.
+
+ exp = exp + 129 - 23
+
+ if (exp <= 0)
+ pixels[op] = 0.0
+
+ else if (exp > 255)
+ pixels[op] = MAX_REAL
+
+ else if (exp > 0 && exp <= 255)
+ pixels[op] = real (mantissa) * tbl [exp]
+
+ # Increment the input pointer for the next word to be unpacked
+ ip = ip + 4
+ }
+end