Annotation of cci/usr/src/usr.bin/bsc/cmd/3270/emreadmod.c, revision 1.1.1.1

1.1       root        1: /*     D.L.Buck and Associates, Inc. - May, 1984
                      2:  *
                      3:  *     COPYRIGHT NOTICE:
                      4:  *             Copyright c 1984 - An unpublished work by
                      5:  *             D.L.Buck and Associates, Inc.
                      6:  *
                      7:  *     PROPRIETARY RIGHTS NOTICE:
                      8:  *             All rights reserved. This document and program contains
                      9:  *             proprietary information of D.L.Buck and Associates,Inc.
                     10:  *             of San Jose, California, U.S.A., embodying confidential
                     11:  *             information,  ideas, and expressions,  no part of which
                     12:  *             may be reproduced, or transmitted in any form or by any
                     13:  *             means,  electronic,  mechanical,  or otherwise, without
                     14:  *             the written permission of D.L.Buck and Associates, Inc.
                     15:  *
                     16:  * NAME
                     17:  *     emreadmod
                     18:  *
                     19:  * SYNOPSIS
                     20:  *     emreadmod(key)
                     21:  *     int key;
                     22:  *
                     23:  * DESCRIPTION
                     24:  *     emreadmod is called by emulate when a 'read modified' function is
                     25:  *     to be emulated. aid_val contains the aid code to send to the host
                     26:  *     which indicates which key was pressed, causing the read
                     27:  *     modified condition: ENTER, PF1-12, PA1-3, CLEAR, TESTREQ.
                     28:  *     key indicates the key which was pressed.
                     29:  *     A series of buffers is prepared, containing all modified fields
                     30:  *     if the keystroke was ENTER or PF1-12, or a short read buffer to
                     31:  *     take care of PA1-3, CLEAR, and TEST REQUEST.
                     32:  *
                     33:  */
                     34: #include <em.h>
                     35: #include "local.h"
                     36: #include <bsc/bscio.h>
                     37: #include <errno.h>
                     38: #include <sys/time.h>
                     39: 
                     40: #define GOZINTA(x) x/64
                     41: #define LEFTOVER(x)  x%64
                     42: #define SBA 0x11
                     43: #define YES    1
                     44: #define        NO      0
                     45: 
                     46: extern int ascii;
                     47: char aadr_tbl[64] = {  /* ASCII hex cursor address encoding table */
                     48:        0x20,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x5b,0x2e,
                     49:        0x3c,0x28,0x2b,0x21,0x26,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
                     50:        0x51,0x52,0x5d,0x24,0x2a,0x29,0x3b,0x5e,0x2d,0x2f,0x53,0x54,
                     51:        0x55,0x56,0x57,0x58,0x59,0x5a,0x7c,0x2c,0x25,0x5f,0x3e,0x3f,
                     52:        0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x23,
                     53:        0x40,0x27,0x3d,0x22};
                     54: char eadr_tbl[] = {    /* EBCDIC hex cursor address encoding table */
                     55:        0x40,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0x4a,0x4b,
                     56:        0x4c,0x4d,0x4e,0x4f,0x50,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
                     57:        0xd8,0xd9,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0xe2,0xe3,
                     58:        0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
                     59:        0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x7b,
                     60:        0x7c,0x7d,0x7e,0x7f};
                     61: 
                     62: char aaid_tbl[18] = {  /* ASCII hex attention id character table */
                     63:        0x27,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x23,
                     64:        0x40,0x25,0x3e,0x2c,0x5f,0x30};
                     65: char eaid_tbl[18] = {  /* EBCDIC hex attention id character table */
                     66:        0x7d,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x7b,
                     67:        0x7c,0x6c,0x6e,0x6b,0x6d,0xf0};
                     68: 
                     69: unsigned sleep();
                     70: extern int devfd;
                     71: extern int errno;
                     72: extern struct bscio p;
                     73: extern int stationid;
                     74: extern char termid;
                     75: extern int pt_to_pt;
                     76: int xmitfd;
                     77: 
                     78: #ifndef lint
                     79: static char sccsid[] = "@(#)emreadmod.c        1.11 REL";
                     80: #endif
                     81: extern char aid_val;
                     82: 
                     83: emreadmod(key)
                     84: int key;
                     85: {
                     86:        char x;
                     87:        register char *chrptr;
                     88: 
                     89:        /* common buffer prelude */
                     90:        if (pt_to_pt == BSCMPT) {       /* multipoint - send addrs */
                     91:             if (key != TESTREQ) {       /* testreq msg has no addr to start */
                     92:                                         /* ttl 5/10/85 */
                     93:                if (bput(termid)<0) return;             /* cluster address */
                     94:                if (bput(stationid)<0) return;  /* subdevice address */
                     95:             }                          
                     96:        }
                     97:        /* Output the `Read Header' - all read types except Test Request */
                     98:        if (key != TESTREQ)     {
                     99:                if (bput(aid_val)< 0) return;
                    100:                if (bput((ascii?aadr_tbl:eadr_tbl)[GOZINTA(cursaddr)])<0)
                    101:                        return;
                    102:                if (bput((ascii?aadr_tbl:eadr_tbl)[LEFTOVER(cursaddr)])<0)
                    103:                        return;
                    104:        } else {        /* output Test Request Read header */
                    105:        /****   if (bput(0x01) < 0) return;    ****/    /* SOH */
                    106:                 ioctl(devfd,BSCSOH,0); /* put in SOH using ioctl.ttl 5/10/85 */
                    107:                if (bput((ascii?'%':0x6c)) < 0) return;
                    108:                if (bput((ascii?'/':0x61)) < 0) return;
                    109:                if (bput(0x02) < 0) return;     /* STX */
                    110:        }
                    111: 
                    112:        /* read modified processing */
                    113:        if (key != PA1 && key != PA2 && key != PA3 && key != CLEAR)     {
                    114:                if (totfields > 0)      {
                    115:                /* search for fields with modified data tag (mdt) bit set */
                    116:                        register int *startptr, *maxptr;
                    117:                        register char *attrptr, *lastattr, *lastchr;
                    118:                        for (attrptr = fldattr,
                    119:                             startptr = fldstart,
                    120:                             maxptr = fldmax,
                    121:                             lastattr = &fldattr[totfields-1];
                    122:                             attrptr <= lastattr;
                    123:                             ++attrptr, ++startptr, ++maxptr) {
                    124:                                if (!(*attrptr & ATTRMDT))
                    125:                                        continue;
                    126:                                /* output SBA, address, field */
                    127:                                if (bput(SBA)<0) return;
                    128:                                if (bput((ascii?
                    129:                                         aadr_tbl:
                    130:                                         eadr_tbl)[GOZINTA(*startptr)])<0)
                    131:                                        return;
                    132:                                if (bput((ascii?
                    133:                                         aadr_tbl:
                    134:                                         eadr_tbl)[LEFTOVER(*startptr)])<0)
                    135:                                        return;
                    136: 
                    137:                                lastchr = &scrn_image[((*maxptr-1) +
                    138:                                        *startptr)%MAXSCREENSIZE];
                    139:                                chrptr = &scrn_image[*startptr];
                    140:                                while (1)       {
                    141:                                        if (*chrptr != '\0') {
                    142:                                                x = *chrptr;
                    143:                                                if (!ascii)
                    144:                                                        ascebc(&x,1);
                    145:                                                if (bput(x)<0) return;
                    146:                                        }
                    147:                                        if (chrptr == lastchr)
                    148:                                                break;
                    149:                                        if(++chrptr>=&scrn_image[MAXSCREENSIZE])
                    150:                                                chrptr = scrn_image;
                    151:                                }
                    152:                        }
                    153:                } else  {/* Unformatted screen */
                    154:                        for (chrptr = scrn_image;
                    155:                             chrptr < &scrn_image[MAXSCREENSIZE];
                    156:                             ++chrptr)
                    157:                                if (*chrptr) {
                    158:                                        x = *chrptr;
                    159:                                        if (!ascii)
                    160:                                                ascebc(&x,1);
                    161:                                        if (bput(x)<0) return;
                    162:                                }
                    163:                }
                    164:        }
                    165:        /* Flush out leftover bytes */
                    166:        ioctl(devfd,BSCLAST,0);
                    167:        flushbuf();
                    168:         if (key == TESTREQ) /* disable SOH mode  ttl 5/10/85 */
                    169:             ioctl(devfd,BSCNSOH,0);
                    170: }
                    171: 
                    172: /* put a character in the transmit buffer */
                    173: char xmitbuf[254], *xmitnext = xmitbuf;
                    174: bput(c)
                    175: register char c;
                    176: {
                    177:        register int needed;    /* # of characters needed for this character
                    178:                                   sequence; 3 for SBA (set buffer address),
                    179:                                   1 for everything else */
                    180:        needed = (c == SBA)? 3: 1;
                    181: 
                    182:        if (sizeof xmitbuf - (int)(xmitnext-xmitbuf) < needed)
                    183:                if (flushbuf()<0) return(-1);
                    184:        *xmitnext++ = c;
                    185:        return(0);
                    186: }
                    187: 
                    188: /* flush the transmit buffer -- write to transmit device */
                    189: extern int tb_ctr;     /* transmitted blocks counter */
                    190: 
                    191: flushbuf()
                    192: {
                    193:        register int l;
                    194:        l = xmitnext - xmitbuf;
                    195:        xmitnext = xmitbuf;
                    196:        errno = 0;
                    197: 
                    198:        if (write(devfd,xmitbuf,l) != l && get_errors())
                    199:                return(-1);
                    200:        ++tb_ctr;
                    201:        return(0);
                    202: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.