home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 25 / nopv25.iso / 040A / CCDL151L.ZIP / MSDOS / 386 / LLMISC.OLD < prev    next >
Encoding:
Text File  |  1997-06-09  |  7.9 KB  |  442 lines

  1.         .386
  2.  
  3. _TEXT        segment para public use32 'CODE'
  4.     extrn __transferx : DWORD, __pspseg : WORD, raisecb:proc
  5.     extrn breakflag : dword, __pmodew : word
  6. _TEXT        ends
  7. cstartup        SEGMENT DWORD PUBLIC USE32 'INITDATA'
  8.                 ENDS
  9. _STARTUPEND_       SEGMENT DWORD PUBLIC USE32 'INITDATA'
  10.                 ENDS
  11. crundown        SEGMENT DWORD PUBLIC USE32 'EXITDATA'
  12.                 ENDS
  13. _RUNDOWNEND_       SEGMENT DWORD PUBLIC USE32 'EXITDATA'
  14.                 ENDS
  15. _CPP_           SEGMENT DWORD PUBLIC USE32 'CPPDATA'
  16.                 ENDS
  17. _CPPEND_        SEGMENT DWORD PUBLIC USE32 'CPPDATA'
  18.         ENDS
  19. _DATA       SEGMENT DWORD PUBLIC USE32 'DATA'
  20.                 ENDS
  21. _BSS            SEGMENT DWORD PUBLIC USE32 'BSS'
  22.                 ENDS
  23. _BSSEND            SEGMENT DWORD PUBLIC USE32 'BSS'
  24.                 ENDS
  25.  
  26.  
  27. DGROUP group _TEXT, cstartup,_STARTUPEND_,crundown,_RUNDOWNEND_,_CPP_,_CPPEND_,_DATA,_BSS,_BSSEND
  28.  
  29.     public todta, fromdta, nametodta, dos
  30.     public __ll_gettime, __ll_ticks, __ll_getenv, __ll_system, __ll_spawn
  31.  
  32. STUB_TEXT       segment para public use16 'TRAN'
  33.         public spawnblock
  34. spawnblock    dw    0
  35.         dw    512+32
  36.         dw    _TEXT
  37.         dw    512
  38.         dw    _TEXT
  39.         dw    512+16
  40.         dw    _TEXT
  41.         dd    0
  42.         dd    0
  43. oldsssp        dd    0
  44. spawnit proc
  45.     push ds
  46.     push es
  47.     mov ax,_TEXT
  48.     mov ds,ax
  49.     mov ax,STUB_TEXT
  50.     mov es,ax
  51.     mov word ptr es:[oldsssp],sp
  52.     mov word ptr es:[oldsssp+2],ss
  53.     mov bx,offset spawnblock
  54.     sub dx,dx
  55.     mov ax,4b00h
  56.     int 21h
  57.     lss sp,cs:[oldsssp]
  58.     pop es
  59.     pop ds
  60.     retf
  61.     
  62. spawnit endp
  63. STUB_TEXT           ends
  64.  
  65. _DATA       SEGMENT DWORD PUBLIC USE32 'DATA'
  66. pfcb1        db    16 dup (' ')
  67. pfcb2        db    16 dup (' ')
  68. pspawnblock    label    word
  69.         dd    0
  70. s_env        dw    0
  71. o_name        dd    0
  72. s_name        dw    0
  73.         dd    0
  74. s_pfcb1        dw    0
  75.         dd    offset DGROUP:pfcb1
  76. s_pfcb2        dw    0
  77.         df    offset DGROUP:pfcb2
  78.         df    0
  79. poldsssp    df    0
  80. rs32_edi    label   dword
  81. rs32_di     dw      ?,?
  82. rs32_esi    label   dword
  83. rs32_si     dw      ?,?
  84. rs32_ebp    label   dword
  85. rs32_bp     dw      ?,?
  86.                 dd      ?
  87. rs32_ebx    label   dword
  88. rs32_bx     label   word
  89. rs32_bl     db      ?
  90. rs32_bh     db      ?,?,?
  91. rs32_edx    label   dword
  92. rs32_dx     label   word
  93. rs32_dl     db      ?
  94. rs32_dh     db      ?,?,?
  95. rs32_ecx    label   dword
  96. rs32_cx     label   word
  97. rs32_cl     db      ?
  98. rs32_ch     db      ?,?,?
  99. rs32_eax    label   dword     
  100. rs32_ax     label   word
  101. rs32_al     db      ?
  102. rs32_ah     db      ?,?,?
  103. rs32_flags  dw      ?
  104. rs32_es     dw      ?
  105. rs32_ds     dw      ?
  106. rs32_fs     dw      ?
  107. rs32_gs     dw      ?
  108. rs32_ip     dw      ?
  109. rs32_cs     dw      ?
  110. rs32_sp     dw      ?
  111. rs32_ss     dw      ?
  112. broken    db 0
  113.         ends
  114. _TEXT        segment
  115.         assume cs:DGROUP,ds:DGROUP
  116. ;
  117. ; copy TO dta and leave dta address in dx
  118. ;
  119. todta:
  120.     mov edi,[__transferx]
  121.     rep movsb
  122.     sub edx,edx
  123.     ret
  124. ;
  125. ; name to dta
  126. ;
  127. nametodta:
  128.     mov edi,[__transferx]
  129. @@ntdl:
  130.     lodsb
  131.     stosb
  132.     or al,al
  133.     jnz @@ntdl
  134.     sub edx,edx
  135.     ret
  136.     
  137. ;
  138. ; copy from dta to our world
  139. ;
  140. fromdta:
  141.     mov edi,esi
  142.     mov esi,[__transferx]
  143.     rep movsb
  144.     ret
  145. ;________________________________________________________________________
  146. ;
  147. ; do a dos call
  148. ;
  149. dos:
  150.     mov rs32_ax,ax            ; store regs in buffer
  151.     mov rs32_bx,bx
  152.     mov rs32_cx,cx
  153.     mov rs32_dx,dx
  154.     mov rs32_si,si
  155.     mov rs32_bp,bp
  156.     mov rs32_di,di
  157.     mov rs32_sp,0
  158.     mov rs32_ss,0
  159.     mov rs32_ds,_TEXT
  160.     mov rs32_es,_TEXT
  161.         mov edi,offset DGROUP:rs32_edi     ; offset of register structure
  162.         xor cx,cx                       ; no parameters on stack
  163.         mov bx,21h                      ; call interrupt 21h
  164.         mov ax,300h                     ; INT 31h function 0300h
  165.     int 31h
  166.     test [broken],-1
  167.     jnz cantbreak
  168.     test [breakflag],-1        ; get out if dos signalled ctrl-break
  169.     jz  cantbreak
  170.     mov [broken],-1
  171.     jmp raisecb
  172. cantbreak:
  173.     mov ax,rs32_flags               ; restore regs from buffer
  174.     mov ah,al
  175.     sahf
  176.     mov ax,rs32_ax
  177.     mov bx,rs32_bx
  178.     mov cx,rs32_cx
  179.     mov dx,rs32_dx
  180.     mov bp,rs32_bp
  181.     mov si,rs32_si
  182.     mov di,rs32_di
  183.     ret
  184. ;________________________________________________________________________
  185. ;
  186. ; low level spawn
  187. ;
  188. ; int __ll_spawn(char *file, char *parms, char *env)
  189. ;
  190. __ll_spawn:
  191.     push ebp
  192.     mov ebp,esp
  193.     test [__pmodew],-1
  194.     jz pmode307spawn
  195.     mov eax,ds
  196.     mov [s_name],ax
  197.     mov [s_pfcb1],ax
  198.     mov [s_pfcb2],ax
  199.     mov eax,[ebp+12]
  200.     mov [o_name],eax
  201.     push es
  202.     mov es,[__pspseg]
  203.     mov ax,es:[2ch]
  204.     mov [s_env],ax
  205.     pop es
  206.     push ds
  207.     push es
  208.     mov edx,[ebp+8]
  209.     mov ebx,offset DGROUP:pspawnblock
  210.     mov ax,4b00h
  211.     int 21h
  212. sp1q:
  213.     mov eax,-1
  214.     jc sp1x
  215.          mov ah,4dh
  216.     int 21h
  217.     or ah,ah
  218.     stc
  219.     jnz sp1q
  220.     and eax,0ffh    
  221. sp1x:
  222.     pop es
  223.     pop ds
  224.     pop ebp
  225.     ret
  226. pmode307spawn:
  227.     push esi
  228.     push edi
  229.     mov esi,[ebp+8]
  230.     mov edi,[__transferx]
  231. llsmov1:
  232.     lodsb
  233.     stosb
  234.     or al,al
  235.     jnz llsmov1
  236.     mov esi,[ebp+12]
  237.     mov edi,[__transferx]
  238.     add edi,32+512
  239. llsmov2:
  240.     lodsb
  241.     stosb
  242.     or al,al
  243.     jnz llsmov2
  244.         mov edi,[__transferx]
  245.     add edi,512
  246.     mov ecx,32
  247.     mov al,' '
  248.     rep stosb
  249.  
  250.     mov rs32_ip,offset spawnit
  251.     mov rs32_cs,STUB_TEXT
  252.     mov rs32_sp,0
  253.     mov rs32_ss,0
  254.     mov rs32_ds,_TEXT
  255.     mov rs32_es,_TEXT
  256.         mov edi,offset DGROUP:rs32_edi     ; offset of register structure
  257.         xor cx,cx                       ; no parameters on stack
  258.     xor bx,bx
  259.         mov ax,301h                     ; INT 31h function 0301h
  260.     int 31h
  261.     test [broken],-1
  262.     jnz cantbreak2
  263.     test [breakflag],-1        ; get out if dos signalled ctrl-break
  264.     jz  cantbreak2
  265.     mov [broken],-1
  266.     jmp raisecb
  267. cantbreak2:
  268.     mov ax,rs32_flags               ; restore regs from buffer
  269.     mov ah,al
  270.     sahf
  271.     mov ax,rs32_ax
  272. sp2q:
  273.     mov eax,-1
  274.     jc sp2x
  275.          mov ah,4dh
  276.     int 21h
  277.     or ah,ah
  278.     stc
  279.     jnz sp2q
  280.     and eax,0ffh    
  281. sp2x:
  282.     pop edi
  283.     pop esi
  284.     pop ebp
  285.     ret
  286. ;________________________________________________________________________
  287. ;struct tm *__ll_gettime(struct tm *tm2)
  288. ;
  289. __ll_gettime:
  290.     push ebp
  291.     push ebx 
  292.     push edi
  293.     push esi
  294.     mov edi,[esp+20]
  295.     mov ecx,9
  296.     xor eax,eax
  297.     rep stosd
  298.     mov ah,2
  299.     int 1ah
  300.     mov esi,[esp+20]
  301.     mov al,dh
  302.     call frombcd
  303.     mov al,cl
  304.     call frombcd
  305.     mov al,ch
  306.     call frombcd
  307.     push esi
  308.     mov ah,4
  309.     int 1ah
  310.     pop esi
  311.     sub eax,eax
  312.     mov al,dl
  313.     call frombcd
  314.     mov al,dh
  315.     call frombcd
  316.     dec dword ptr [esi-4]
  317.     mov al,cl
  318.     call frombcd
  319.     mov al,ch
  320.     call frombcd2
  321.     mov ebx,100
  322.     mul ebx
  323.     add [esi],eax
  324.     mov eax,[esp+20]
  325.     pop esi
  326.     pop edi
  327.     pop ebx
  328.     pop ebp
  329.     ret
  330. frombcd:
  331.     call frombcd2
  332.     mov [esi],eax
  333.     add esi,4
  334.     ret
  335. frombcd2:
  336.     mov bl,al
  337.     shr al,4
  338.     mov bh,10
  339.     mul bh
  340.     and bl,15
  341.     add al,bl
  342.     ret
  343. ;________________________________________________________________________
  344. ;int__ll_ticks(void)
  345. ;
  346. __ll_ticks:
  347.     push ebp
  348.     push ebx
  349.     push esi
  350.     push edi
  351.     sub ah,ah
  352.     int 1ah
  353.     mov eax,ecx
  354.     shl eax,16
  355.     mov ax,dx
  356.     pop edi
  357.     pop esi
  358.     pop ebx
  359.     pop ebp
  360.     ret
  361. ;________________________________________________________________________
  362. ;int__ll_system(char *name)
  363. ;
  364. __ll_system:
  365.     sub eax,eax
  366.     ret
  367. ;________________________________________________________________________
  368. ;int __ll_getenv(char *buf, int id)
  369. ;
  370. __ll_getenv:
  371.     push esi
  372.     push edi
  373.     push ebp
  374.     push ebx
  375.     push es
  376.     mov es,[__pspseg]
  377.     mov es,es:[02ch]
  378.     mov edx,[esp+24]
  379.     or edx,edx
  380.     jz @@count
  381.     mov edx,[esp+28]
  382.     sub    eax,eax            ; set up for scan
  383.     mov     edi,eax
  384.     mov     ecx,-1
  385.     test     byte ptr es:[edi],0ffh
  386.     jz    @@errenv
  387. @@lp1:
  388.     dec edx
  389.     jz    @@gotenv
  390.     repnz    scasb            ; scan for end of environment
  391.     test    byte ptr es:[edi],0ffh
  392.     jnz     @@lp1
  393.     jmp    @@errenv
  394. @@gotenv:
  395.     mov    esi,[esp+24]
  396.     xchg    esi,edi
  397.     cli
  398.     push    ds
  399.     push    ds
  400.     push    es
  401.     pop    ds
  402.     pop    es
  403. @@mvlp:
  404.     lodsb
  405.     stosb
  406.     or al,al
  407.     jnz @@mvlp
  408.     pop ds
  409.     sti
  410.     sub eax,eax
  411.     inc eax
  412.     jmp    @@exit
  413. @@errenv:
  414.     sub    eax,eax
  415.     jmp    @@exit
  416.     
  417.  
  418. @@count:
  419.     sub    eax,eax            ; set up for scan
  420.     mov     edi,eax
  421.     mov     ecx,-1
  422.     mov edx,0
  423.     test     BYTE PTR es:[edi],0ffh
  424.     jz    @@noenv
  425. @@lp:
  426.     inc edx
  427.     repnz    scasb            ; scan for end of environment
  428.     test    byte ptr es:[edi],0ffh
  429.     jnz     @@lp
  430. @@noenv:
  431.     mov eax,edx
  432. @@exit:
  433.     pop es
  434.     pop ebx
  435.     pop ebp
  436.     pop edi
  437.     pop esi
  438.     ret
  439.     
  440. _TEXT        ends
  441.  
  442.                 END