home *** CD-ROM | disk | FTP | other *** search
/ Groovy Bytes: Behind the Moon / groovybytes.iso / GROOVY / SND_TOOL / FUNK108A.ZIP / DOS32V30.ZIP / PAL / STARTUP / C0.ASM next >
Encoding:
Assembly Source File  |  1995-06-04  |  4.6 KB  |  167 lines

  1. ;****************************************************************************
  2. ; Filename: C0.ASM
  3. ;   Author: Adam Seychell and Peter Anderson
  4. ;  Version: 0.0
  5. ;  Created: ?
  6. ;  Updated: 1995.03.12 - Peter Andersson, general update for DOS32 v3.0
  7. ;  Comment: Startup file
  8. ;****************************************************************************
  9. ; Copyright Adam Seychell, 1994-1995.
  10. ; All rights reserved.
  11. ;****************************************************************************
  12.  
  13.     Include    STDDEF.INC
  14.  
  15.     Stack    16384
  16.  
  17.     Codeseg
  18.  
  19.  
  20.  
  21. Public AbortStackPos
  22. Public NoLanguage ExitSlow,NoLanguage ExitQuick
  23.  
  24. PROC   startup NoLanguage
  25.         Mov    [AbortStackPos],Esp    ; Save the stack pointer
  26.  
  27.         Mov    Ax,0EE02h        ; Fixup the standard variables
  28.         Int    31h
  29.         Neg    Ebx
  30.         Mov    [_psp],Esi
  31.         Mov    [_environ],Edi
  32.         Mov    [_zero],Ebx
  33.         Mov    [exesize],Edx
  34.         Mov    [exename],Ecx
  35.  
  36.     Ifndef    NO_DMA
  37.         Mov    Eax,0EE41h        ; Allocate 16Kb DMA buffer
  38.         Int    31h
  39.         Jc    @@Exit01
  40.         Mov    [DMA_addr],Edx        ; Store near pointer
  41.         Mov    [DMA_phys],Ebx        ; Store physical address
  42.     Endif
  43.  
  44.         Mov    Ax,0EE00h
  45.         Int    31h
  46.         And    Eax,0FFFFh
  47.         Mov    [dos32version],Eax    ; Save DOS32 version number
  48.         Mov    [dos32system],Dl    ; Save DOS32 system type
  49.         Mov    [_zero_sel],Ebx
  50.  
  51.         Mov    Ax,0EE42h        ; Allocate 4Gb block
  52.         Mov    Edx,0FFFFFFFFh
  53.         Int    31h            ; EAX = size, EDX = ptr
  54.  
  55.         Xchg    Eax,Edx
  56.         Call    @setmem
  57.         TestZ    Eax
  58.         Jz    @@Exit01
  59.  
  60.  
  61.     ;
  62.     ; Fixup the environment pointer table and it's varibles
  63.     ;
  64.         Mov    Eax,[_environ]    ; Get the environment pointer
  65.         Mov    Edi,Esp
  66.     Align    4
  67. @@Loop01:    Mov    [Esp],Eax       ; Save EAX
  68.         Call    @strlen
  69.         TestZ    Eax
  70.         Jz    @@Next01
  71.         Add    Eax,[Esp]
  72.         Inc    Eax
  73.         Push    Eax
  74.         Jmp    @@Loop01
  75.     Align    4
  76. @@Next01:    Mov    Ecx,[Edi]    ; Swap first and last to make the last
  77.         Xchg    [Esp],Ecx    ; one a zero length string
  78.         Mov    [Edi],Ecx
  79.         Mov    [environ],Esp    ; Save environment pointer table pointer
  80.         Sub    Edi,Esp
  81.         Shr    Edi,2
  82.         Mov    [_envsize],Edi    ; Save environment size
  83.  
  84.  
  85.  ;
  86.  ; Fixup command line argument table on the stack
  87.  ;
  88.                 Clear   Ecx
  89.         Mov    Ebx,[_psp]
  90.         Mov    Cl,[Ebx+80h]
  91.                 Lea     Esi,[Ebx+81h]     ; Esi -> first character in cmd tail
  92.                 Mov     Ebx,Ecx             ; save Ecx
  93.                 Sub     Esp,128             ; Allocate mem for cmd tail
  94.                 Mov     Edi,Esp
  95.                 Cld
  96.                 Rep     Movsb               ; copy cmd tail to buffer
  97.                 Mov     Ecx,Ebx             ; restore Ecx
  98.                 Lea     Edi,[Esp+Ecx-1]   ; Esi -> last character in cmd tail
  99.                 Std
  100.                 Mov     Al," "
  101.                 Mov     Ebx,1
  102. CmdTailLoop:
  103.                 Repe    Scasb                   ; search for a non " " char
  104.                 TestZ   Ecx
  105.                 Jz      TailExit
  106.                 Inc     Ebx
  107.                 Inc     Edi
  108.                 Mov     [Byte Edi+1],0
  109.                 Inc     Ecx
  110.                 Repne   Scasb                   ; search for a " " char
  111.                 Inc     Edi
  112.                 Push    Edi                     ; push argv[] pointer on stack
  113.                 Inc     [Dword PTR Esp]
  114.                 TestZ   Ecx
  115.                 Jz      TailExit
  116.                 Inc     Ecx
  117.                 jmp     CmdTailLoop
  118. TailExit:       Push    [exename]             ; Store EXE file namepath
  119.                 Mov     Eax,Esp
  120.  
  121.     ;
  122.     ; Call the main!    /*  int main ( int argc, char * argv[], environ); */
  123.     ;
  124.                 Push    [_environ]            ; pass environment pointer
  125.                 Push    Eax                   ; pass pointer to pointer array
  126.                 Push    Ebx                   ; pass arg count
  127.                 Call    main                  ; Start up the main()!
  128.  
  129. ExitSlow:    Mov    Esi,Eax
  130.         Call    _cexit
  131.         Mov    Eax,Esi
  132. ExitQuick:    Mov    Ah,4Ch
  133.         Int    21h
  134.     Align    4
  135. @@Exit01:    Mov     Edx,Offset MemoryError
  136.                 Mov     Ah,9
  137.                 Int     21h
  138.         Mov    Al,3
  139.         Jmp    ExitQuick
  140. ENDP
  141.  
  142.     Dataseg
  143.  
  144.     Ifndef    NO_DMA
  145. DMA_addr    Dd    ?            ; DMA near pointer address
  146. DMA_size    Dd    8192            ; DMA size in bytes
  147. DMA_phys    Dd    ?            ; DMA physical address
  148.     Endif
  149.  
  150.  
  151. _environ    Dd    ?        ; pointer to environment
  152. _envsize    Dd    ?        ; environment table entries.
  153. environ            Dd    ?        ; Table environment pointer
  154. _psp        Dd    ?        ; PSP pointer
  155. exesize        Dd    ?        ; Executable size
  156. exename        Dd    ?        ; Executable name
  157. _zero        Dd    ?        ; Relative address to zero
  158. _zero_sel    Dd    ?             ; 4GB ZERO selector (not NULL!)
  159. dos32version    Dd    ?        ; DOS32 version
  160. dos32system    Db    ?        ; System extender type
  161.  
  162. AbortStackPos    Dd    ?        ; Saved stack position (abort)
  163. ExitStatus    Db    3        ; Exit status
  164.  
  165. MemoryError    Db    "Out of memory...",CRLF,0
  166.     End    startup
  167.