Annotation of 43BSDReno/usr.bin/tn3270/distribution/sys_dos/spintc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)spintc.c   4.1 (Berkeley) 12/4/88";
                     20: #endif /* not lint */
                     21: 
                     22: #include <stdio.h>
                     23: #include <dos.h>
                     24: #include <stdlib.h>
                     25: 
                     26: #include "../general/general.h"
                     27: #include "spint.h"
                     28: 
                     29: #define        PSP_ENVIRONMENT         0x2c
                     30: #define        PSP_FCB1                0x5c
                     31: #define        PSP_FCB2                0x6c
                     32: 
                     33: typedef struct {
                     34:     int
                     35:        environment,            /* Segment address of environment */
                     36:        cmd_ptr_offset,         /* Offset of command to execute */
                     37:        cmd_ptr_segment,        /* Segment where command lives */
                     38:        fcb1_ptr_offset,        /* Offset of FCB 1 */
                     39:        fcb1_ptr_segment,       /* Segment of FCB 1 */
                     40:        fcb2_ptr_offset,        /* Offset of FCB 2 */
                     41:        fcb2_ptr_segment;       /* Segment of FCB 2 */
                     42: } ExecList;
                     43: 
                     44: 
                     45: static int int_offset, int_segment;
                     46: 
                     47: 
                     48: void
                     49: spint_finish(spint)
                     50: Spint *spint;
                     51: {
                     52:     union REGS regs;
                     53:     struct SREGS sregs;
                     54: 
                     55:     if (spint->done == 0) {
                     56:        return;                         /* Not done yet */
                     57:     }
                     58: 
                     59:     /*
                     60:      * Restore old interrupt handler.
                     61:      */
                     62: 
                     63:     regs.h.ah = 0x25;
                     64:     regs.h.al = spint->int_no;
                     65:     regs.x.dx = int_offset;
                     66:     sregs.ds = int_segment;
                     67:     intdosx(&regs, &regs, &sregs);
                     68: 
                     69:     if (spint->regs.x.cflag) {
                     70:        fprintf(stderr, "0x%x return code from EXEC.\n", spint->regs.x.ax);
                     71:        spint->done = 1;
                     72:        spint->rc = 99;
                     73:        return;
                     74:     }
                     75: 
                     76:     regs.h.ah = 0x4d;                  /* Get return code */
                     77: 
                     78:     intdos(&regs, &regs);
                     79: 
                     80:     spint->rc = regs.x.ax;
                     81: }
                     82: 
                     83: void
                     84: spint_continue(spint)
                     85: Spint *spint;
                     86: {
                     87:     _spint_continue(spint);            /* Return to caller */
                     88:     spint_finish(spint);
                     89: }
                     90: 
                     91: 
                     92: void
                     93: spint_start(command, spint)
                     94: char *command;
                     95: Spint *spint;
                     96: {
                     97:     ExecList mylist;
                     98:     char *comspec;
                     99:     void _spint_int();
                    100:     union REGS regs;
                    101:     struct SREGS sregs;
                    102: 
                    103:     /*
                    104:      * Get comspec.
                    105:      */
                    106:     comspec = getenv("COMSPEC");
                    107:     if (comspec == 0) {                        /* Can't find where command.com is */
                    108:        fprintf(stderr, "Unable to find COMSPEC in the environment.");
                    109:        spint->done = 1;
                    110:        spint->rc = 99; /* XXX */
                    111:        return;
                    112:     }
                    113: 
                    114:     /*
                    115:      * Now, hook up our interrupt routine.
                    116:      */
                    117: 
                    118:     regs.h.ah = 0x35;
                    119:     regs.h.al = spint->int_no;
                    120:     intdosx(&regs, &regs, &sregs);
                    121: 
                    122:     /* Save old routine */
                    123:     int_offset = regs.x.bx;
                    124:     int_segment = sregs.es;
                    125: 
                    126:     regs.h.ah = 0x25;
                    127:     regs.h.al = spint->int_no;
                    128:     regs.x.dx = (int) _spint_int;
                    129:     segread(&sregs);
                    130:     sregs.ds = sregs.cs;
                    131:     intdosx(&regs, &regs, &sregs);
                    132: 
                    133:     /*
                    134:      * Read in segment registers.
                    135:      */
                    136: 
                    137:     segread(&spint->sregs);
                    138: 
                    139:     /*
                    140:      * Set up registers for the EXEC call.
                    141:      */
                    142: 
                    143:     spint->regs.h.ah = 0x4b;
                    144:     spint->regs.h.al = 0;
                    145:     spint->regs.x.dx = (int) comspec;
                    146:     spint->sregs.es = spint->sregs.ds;         /* Superfluous, probably */
                    147:     spint->regs.x.bx = (int) &mylist;
                    148: 
                    149:     /*
                    150:      * Set up EXEC parameter list.
                    151:      */
                    152: 
                    153:     ClearElement(mylist);
                    154:     mylist.cmd_ptr_offset = (int) command;
                    155:     mylist.cmd_ptr_segment = spint->sregs.ds;
                    156:     mylist.fcb1_ptr_offset = PSP_FCB1;
                    157:     mylist.fcb1_ptr_segment = _psp;
                    158:     mylist.fcb2_ptr_offset = PSP_FCB2;
                    159:     mylist.fcb2_ptr_segment = _psp;
                    160:     mylist.environment = *((int far *)(((long)_psp<<16)|PSP_ENVIRONMENT));
                    161: 
                    162:     /*
                    163:      * Call to assembly language routine to actually set up for
                    164:      * the spint.
                    165:      */
                    166: 
                    167:     _spint_start(spint);
                    168: 
                    169:     spint_finish(spint);
                    170: }

unix.superglobalmegacorp.com

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