168 lines
4.9 KiB
NASM
168 lines
4.9 KiB
NASM
|
;
|
|||
|
;***************************************
|
|||
|
;* TIPC Scheme Runtime Support *
|
|||
|
;* *
|
|||
|
;* (C) Copyright 1985 by Texas *
|
|||
|
;* Instruments Incorporated. *
|
|||
|
;* All rights reserved. *
|
|||
|
;* *
|
|||
|
;* Date Written: 5 June 1985 *
|
|||
|
;* Last Modification: 15 May 1986 *
|
|||
|
;***************************************
|
|||
|
page 60,132
|
|||
|
.286c
|
|||
|
|
|||
|
include smmu.mac
|
|||
|
|
|||
|
MSDOS equ 021h ; MS-DOS service call interrupt
|
|||
|
BIDTASK equ 04Bh ; Load/Execute program
|
|||
|
|
|||
|
DGROUP group data
|
|||
|
data segment word public 'DATA'
|
|||
|
assume DS:DGROUP
|
|||
|
extrn _psp:dword ; program segment prefix paragraph address
|
|||
|
|
|||
|
cmd_ db "COMSPEC="
|
|||
|
cmd_1 equ $
|
|||
|
ENVPTR dw 0 ; DOS EXEC parameter block
|
|||
|
CMDOFF dw 0 ; "
|
|||
|
CMDSEG dw 0 ; "
|
|||
|
FCB1OFF dw 5Ch ; "
|
|||
|
FCB1SEG dw 0 ; "
|
|||
|
FCB2OFF dw 6Ch ; "
|
|||
|
FCB2SEG dw 0 ; "
|
|||
|
|
|||
|
INSTALLED dw 0 ; Whether crt interrupt is installed or not
|
|||
|
|
|||
|
data ends
|
|||
|
|
|||
|
XGROUP group PROGX
|
|||
|
PROGX segment byte public 'PROGX'
|
|||
|
assume CS:XGROUP
|
|||
|
|
|||
|
;************************************************************************
|
|||
|
;* Bid another Task *
|
|||
|
;************************************************************************
|
|||
|
|
|||
|
;
|
|||
|
; BP is set up by bid (the caller of this routine)
|
|||
|
;
|
|||
|
bid_args struc
|
|||
|
dw ? ; caller's BP
|
|||
|
dw ? ; return address (caller of bid)
|
|||
|
bid_file dw ? ; program's file name
|
|||
|
bid_parm dw ? ; parameters
|
|||
|
free_req dw ? ; requested # of free paragraphs
|
|||
|
display dw ? ; Indicates if screen should be disturbed
|
|||
|
bid_args ends
|
|||
|
|
|||
|
|
|||
|
bid_task proc far
|
|||
|
push ES
|
|||
|
|
|||
|
; Set up parameter block
|
|||
|
mov AX,[BP].bid_parm ; Set up dword pointer to command line
|
|||
|
mov CMDOFF,AX
|
|||
|
mov CMDSEG,DS
|
|||
|
|
|||
|
mov AX,word ptr _psp+2 ; Point to FCBs in program segment prefix
|
|||
|
mov FCB1SEG,AX
|
|||
|
mov FCB2SEG,AX
|
|||
|
|
|||
|
mov ES,AX
|
|||
|
mov AX,ES:[02Ch] ; copy current environment ptr to
|
|||
|
mov ENVPTR,AX ; parameter area
|
|||
|
|
|||
|
; Set ES:BX to address of parameter block
|
|||
|
mov AX,DS
|
|||
|
mov ES,AX
|
|||
|
mov BX,offset ENVPTR
|
|||
|
|
|||
|
; Set DS:DX to address of ASCIZ pathname (of file to be loaded)
|
|||
|
push DS ; save DS segment register
|
|||
|
mov DX,[BP].bid_file
|
|||
|
mov DI,DX
|
|||
|
cmp byte ptr [di],0 ; check if pt'ed to string is empty
|
|||
|
jne bid_it
|
|||
|
|
|||
|
; No filename-- bid up a new command interpreter;
|
|||
|
; have to search environment for COMSPEC= string
|
|||
|
mov ES,ENVPTR ; ES:DI points to 1st string in environment
|
|||
|
xor DI,DI
|
|||
|
|
|||
|
; Test for end of environment
|
|||
|
get_plop: cmp byte ptr ES:[DI],0 ; last entry in environment?
|
|||
|
je cmd_err ; if so, COMSPEC= not found
|
|||
|
mov SI,offset cmd_ ; load address of comparison string
|
|||
|
mov CX,cmd_1-cmd_ ; and length of same
|
|||
|
repe cmps cmd_,ES:[DI] ; does this entry begin "COMSPEC="?
|
|||
|
je found ; if so, found it! (jump)
|
|||
|
xor AX,AX ; clear AX for search
|
|||
|
mov CX,-1 ; set CX for maximum length
|
|||
|
repne scas byte ptr ES:[DI] ; find \0 which terminates string
|
|||
|
jmp get_plop ; loop
|
|||
|
|
|||
|
; No command interpreter found
|
|||
|
cmd_err: mov AX,10 ; treat as bad-environment error
|
|||
|
stc
|
|||
|
jmp short get_out
|
|||
|
|
|||
|
; Found COMSPEC=
|
|||
|
found: mov DX,DI ; DS:DX is ptr to command interpreter
|
|||
|
push DS ; (swap DS and ES)
|
|||
|
push ES
|
|||
|
pop DS
|
|||
|
pop ES
|
|||
|
|
|||
|
; issue load task function call
|
|||
|
bid_it:
|
|||
|
xor AL,AL ; load and execute condition
|
|||
|
mov AH,BIDTASK
|
|||
|
; load "load and execute" ftn id
|
|||
|
int MSDOS ; perform service call
|
|||
|
get_out: pop DS ; restore DS segment register
|
|||
|
jc exit ; branch if error in bidding task
|
|||
|
xor AX,AX ; indicate no error
|
|||
|
exit:
|
|||
|
pop ES ; restore ES segment register
|
|||
|
ret ; return to caller
|
|||
|
bid_task endp
|
|||
|
|
|||
|
|
|||
|
PROGX ends
|
|||
|
|
|||
|
PGROUP group prog
|
|||
|
prog segment byte public 'PROG'
|
|||
|
assume CS:PGROUP
|
|||
|
extrn unfixint:near,fix_intr:near
|
|||
|
extrn zcuron:near,zcuroff:near
|
|||
|
extrn set_crtint:near,reset_crtint:near
|
|||
|
|
|||
|
|
|||
|
public bid
|
|||
|
bid proc near
|
|||
|
push bp
|
|||
|
mov bp,sp ;address local arguments
|
|||
|
|
|||
|
call unfixint ;reset shift-break vector
|
|||
|
call zcuron ;turn the cursor back on
|
|||
|
cmp [bp].display,0 ;can we disturb the screen?
|
|||
|
je no_install ; yes, jump
|
|||
|
call set_crtint ; no, take over crt interrupt
|
|||
|
no_install:
|
|||
|
call bid_task ;go bid the task
|
|||
|
push AX ;save its error return code
|
|||
|
|
|||
|
cmp [bp].display,0 ;crt interrupt taken over
|
|||
|
je no_uninstall ; no, jump
|
|||
|
call reset_crtint ; yes, reset the crt interrupt
|
|||
|
no_uninstall:
|
|||
|
call zcuroff ;turn the cursor back off
|
|||
|
call fix_intr ;set shift-break vector
|
|||
|
pop AX ;restore error code
|
|||
|
pop bp ;dump args from stack
|
|||
|
ret ;return to caller
|
|||
|
bid endp
|
|||
|
prog ends
|
|||
|
end
|
|||
|
|