home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 25 / nopv25.iso / 040A / CCDL151L.ZIP / MSDOS / 386 / LLMISC.ASM < prev    next >
Encoding:
Assembly Source File  |  1997-06-12  |  8.0 KB  |  455 lines

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