home *** CD-ROM | disk | FTP | other *** search
- .386
-
- _TEXT segment para public use32 'CODE'
- extrn __transferx : DWORD, __pspseg : WORD, raisecb:proc
- extrn breakflag : dword, __pmodew : word
- _TEXT ends
- cstartup SEGMENT DWORD PUBLIC USE32 'INITDATA'
- ENDS
- _STARTUPEND_ SEGMENT DWORD PUBLIC USE32 'INITDATA'
- ENDS
- crundown SEGMENT DWORD PUBLIC USE32 'EXITDATA'
- ENDS
- _RUNDOWNEND_ SEGMENT DWORD PUBLIC USE32 'EXITDATA'
- ENDS
- _CPP_ SEGMENT DWORD PUBLIC USE32 'CPPDATA'
- ENDS
- _CPPEND_ SEGMENT DWORD PUBLIC USE32 'CPPDATA'
- ENDS
- _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
- ENDS
- _BSS SEGMENT DWORD PUBLIC USE32 'BSS'
- ENDS
- _BSSEND SEGMENT DWORD PUBLIC USE32 'BSS'
- ENDS
-
-
- DGROUP group _TEXT, cstartup,_STARTUPEND_,crundown,_RUNDOWNEND_,_CPP_,_CPPEND_,_DATA,_BSS,_BSSEND
-
- public todta, fromdta, nametodta, dos
- public __ll_gettime, __ll_ticks, __ll_getenv, __ll_system, __ll_spawn
-
- STUB_TEXT segment para public use16 'TRAN'
- public spawnblock
- spawnblock dw 0
- dw 512+32
- dw _TEXT
- dw 512
- dw _TEXT
- dw 512+16
- dw _TEXT
- dd 0
- dd 0
- oldsssp dd 0
- spawnit proc
- push ds
- push es
- mov ax,_TEXT
- mov ds,ax
- mov ax,STUB_TEXT
- mov es,ax
- mov word ptr es:[oldsssp],sp
- mov word ptr es:[oldsssp+2],ss
- mov bx,offset spawnblock
- sub dx,dx
- mov ax,4b00h
- int 21h
- lss sp,cs:[oldsssp]
- pop es
- pop ds
- retf
-
- spawnit endp
- STUB_TEXT ends
-
- _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
- pfcb1 db 16 dup (' ')
- pfcb2 db 16 dup (' ')
- pspawnblock label word
- dd 0
- s_env dw 0
- o_name dd 0
- s_name dw 0
- dd 0
- s_pfcb1 dw 0
- dd offset DGROUP:pfcb1
- s_pfcb2 dw 0
- df offset DGROUP:pfcb2
- df 0
- poldsssp df 0
- rs32_edi label dword
- rs32_di dw ?,?
- rs32_esi label dword
- rs32_si dw ?,?
- rs32_ebp label dword
- rs32_bp dw ?,?
- dd ?
- rs32_ebx label dword
- rs32_bx label word
- rs32_bl db ?
- rs32_bh db ?,?,?
- rs32_edx label dword
- rs32_dx label word
- rs32_dl db ?
- rs32_dh db ?,?,?
- rs32_ecx label dword
- rs32_cx label word
- rs32_cl db ?
- rs32_ch db ?,?,?
- rs32_eax label dword
- rs32_ax label word
- rs32_al db ?
- rs32_ah db ?,?,?
- rs32_flags dw ?
- rs32_es dw ?
- rs32_ds dw ?
- rs32_fs dw ?
- rs32_gs dw ?
- rs32_ip dw ?
- rs32_cs dw ?
- rs32_sp dw ?
- rs32_ss dw ?
- broken db 0
- ends
- _TEXT segment
- assume cs:DGROUP,ds:DGROUP
- ;
- ; copy TO dta and leave dta address in dx
- ;
- todta:
- mov edi,[__transferx]
- rep movsb
- sub edx,edx
- ret
- ;
- ; name to dta
- ;
- nametodta:
- mov edi,[__transferx]
- @@ntdl:
- lodsb
- stosb
- or al,al
- jnz @@ntdl
- sub edx,edx
- ret
-
- ;
- ; copy from dta to our world
- ;
- fromdta:
- mov edi,esi
- mov esi,[__transferx]
- rep movsb
- ret
- ;________________________________________________________________________
- ;
- ; do a dos call
- ;
- dos:
- mov rs32_ax,ax ; store regs in buffer
- mov rs32_bx,bx
- mov rs32_cx,cx
- mov rs32_dx,dx
- mov rs32_si,si
- mov rs32_bp,bp
- mov rs32_di,di
- mov rs32_sp,0
- mov rs32_ss,0
- mov rs32_ds,_TEXT
- mov rs32_es,_TEXT
- mov edi,offset DGROUP:rs32_edi ; offset of register structure
- xor cx,cx ; no parameters on stack
- mov bx,21h ; call interrupt 21h
- mov ax,300h ; INT 31h function 0300h
- int 31h
- test [broken],-1
- jnz cantbreak
- test [breakflag],-1 ; get out if dos signalled ctrl-break
- jz cantbreak
- mov [broken],-1
- jmp raisecb
- cantbreak:
- mov ax,rs32_flags ; restore regs from buffer
- mov ah,al
- sahf
- mov ax,rs32_ax
- mov bx,rs32_bx
- mov cx,rs32_cx
- mov dx,rs32_dx
- mov bp,rs32_bp
- mov si,rs32_si
- mov di,rs32_di
- ret
- ;________________________________________________________________________
- ;
- ; low level spawn
- ;
- ; int __ll_spawn(char *file, char *parms, char *env)
- ;
- __ll_spawn:
- push ebp
- mov ebp,esp
- test [__pmodew],-1
- jz pmode307spawn
- mov eax,ds
- mov [s_name],ax
- mov [s_pfcb1],ax
- mov [s_pfcb2],ax
- mov eax,[ebp+12]
- mov [o_name],eax
- push es
- mov es,[__pspseg]
- mov ax,es:[2ch]
- mov [s_env],ax
- pop es
- push ds
- push es
- mov edx,[ebp+8]
- mov ebx,offset DGROUP:pspawnblock
- mov ax,4b00h
- int 21h
- sp1q:
- mov eax,-1
- jc sp1x
- mov ah,4dh
- int 21h
- or ah,ah
- stc
- jnz sp1q
- and eax,0ffh
- sp1x:
- pop es
- pop ds
- pop ebp
- ret
- pmode307spawn:
- push esi
- push edi
- mov esi,[ebp+8]
- mov edi,[__transferx]
- llsmov1:
- lodsb
- stosb
- or al,al
- jnz llsmov1
- mov esi,[ebp+12]
- mov edi,[__transferx]
- add edi,32+512
- llsmov2:
- lodsb
- stosb
- or al,al
- jnz llsmov2
- mov edi,[__transferx]
- add edi,512
- mov ecx,32
- mov al,' '
- rep stosb
-
- mov rs32_ip,offset spawnit
- mov rs32_cs,STUB_TEXT
- mov rs32_sp,0
- mov rs32_ss,0
- mov rs32_ds,_TEXT
- mov rs32_es,_TEXT
- mov edi,offset DGROUP:rs32_edi ; offset of register structure
- xor cx,cx ; no parameters on stack
- xor bx,bx
- mov ax,301h ; INT 31h function 0301h
- int 31h
- test [broken],-1
- jnz cantbreak2
- test [breakflag],-1 ; get out if dos signalled ctrl-break
- jz cantbreak2
- mov [broken],-1
- jmp raisecb
- cantbreak2:
- mov ax,rs32_flags ; restore regs from buffer
- mov ah,al
- sahf
- mov ax,rs32_ax
- sp2q:
- mov eax,-1
- jc sp2x
- mov ah,4dh
- int 21h
- or ah,ah
- stc
- jnz sp2q
- and eax,0ffh
- sp2x:
- pop edi
- pop esi
- pop ebp
- ret
- ;________________________________________________________________________
- ;struct tm *__ll_gettime(struct tm *tm2)
- ;
- __ll_gettime:
- push ebp
- push ebx
- push edi
- push esi
- mov edi,[esp+20]
- mov ecx,9
- xor eax,eax
- rep stosd
- mov ah,2
- int 1ah
- mov esi,[esp+20]
- mov al,dh
- call frombcd
- mov al,cl
- call frombcd
- mov al,ch
- call frombcd
- push esi
- mov ah,4
- int 1ah
- pop esi
- sub eax,eax
- mov al,dl
- call frombcd
- mov al,dh
- call frombcd
- dec dword ptr [esi-4]
- mov al,cl
- call frombcd
- mov al,ch
- call frombcd2
- mov ebx,100
- mul ebx
- add [esi],eax
- mov eax,[esp+20]
- pop esi
- pop edi
- pop ebx
- pop ebp
- ret
- frombcd:
- call frombcd2
- mov [esi],eax
- add esi,4
- ret
- frombcd2:
- mov bl,al
- shr al,4
- mov bh,10
- mul bh
- and bl,15
- add al,bl
- ret
- ;________________________________________________________________________
- ;int__ll_ticks(void)
- ;
- __ll_ticks:
- push ebp
- push ebx
- push esi
- push edi
- sub ah,ah
- int 1ah
- mov eax,ecx
- shl eax,16
- mov ax,dx
- pop edi
- pop esi
- pop ebx
- pop ebp
- ret
- ;________________________________________________________________________
- ;int__ll_system(char *name)
- ;
- __ll_system:
- sub eax,eax
- ret
- ;________________________________________________________________________
- ;int __ll_getenv(char *buf, int id)
- ;
- __ll_getenv:
- push esi
- push edi
- push ebp
- push ebx
- push es
- mov es,[__pspseg]
- mov es,es:[02ch]
- mov edx,[esp+24]
- or edx,edx
- jz @@count
- mov edx,[esp+28]
- sub eax,eax ; set up for scan
- mov edi,eax
- mov ecx,-1
- test byte ptr es:[edi],0ffh
- jz @@errenv
- @@lp1:
- dec edx
- jz @@gotenv
- repnz scasb ; scan for end of environment
- test byte ptr es:[edi],0ffh
- jnz @@lp1
- jmp @@errenv
- @@gotenv:
- mov esi,[esp+24]
- xchg esi,edi
- cli
- push ds
- push ds
- push es
- pop ds
- pop es
- @@mvlp:
- lodsb
- stosb
- or al,al
- jnz @@mvlp
- pop ds
- sti
- sub eax,eax
- inc eax
- jmp @@exit
- @@errenv:
- sub eax,eax
- jmp @@exit
-
-
- @@count:
- sub eax,eax ; set up for scan
- mov edi,eax
- mov ecx,-1
- mov edx,0
- test BYTE PTR es:[edi],0ffh
- jz @@noenv
- @@lp:
- inc edx
- repnz scasb ; scan for end of environment
- test byte ptr es:[edi],0ffh
- jnz @@lp
- @@noenv:
- mov eax,edx
- @@exit:
- pop es
- pop ebx
- pop ebp
- pop edi
- pop esi
- ret
-
- _TEXT ends
-
- END