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

unix.superglobalmegacorp.com

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