Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;   2021, Edited by Coldy
  3. ;
  4. ;   This module same as original crt0.asm, but cut:
  5. ;     1. virtual header block (hparams change to __app_params, hpath change to __app_path)
  6. ;     2. init heap of memory - not needed because 68.18 (68.19) init heap implicitly
  7. ;        (it is does dll.obj)
  8. ;     3. loader (he lives in dll.obj)
  9. ;
  10.  
  11. format ELF
  12. section '.text' executable
  13. public start
  14. public start as '_start'
  15.  
  16. extrn main
  17. ;include 'debug2.inc'
  18. include '/../../../../../../proc32.inc'
  19. include '/../../../../../../macros.inc'
  20. __DEBUG__       = 0
  21.  
  22. __app_params   equ 0x1C     ; Pointer to program arguments
  23. ;__app_path     equ 0x20    ; Pointer to program path
  24.  
  25. start:
  26. ;DEBUGF 'Start programm\n'
  27.  
  28.     mov  [argc], 0
  29.     mov  eax, [__app_params]
  30.     test eax, eax
  31.     jz   .without_path
  32.     mov  eax, path
  33.     cmp  word ptr eax, 32fh  ; '/#3'  UTF8
  34.     jne  .without_path
  35.     mov  word ptr eax, 12fh  ; '/#1'  fix to CP866
  36. .without_path:
  37.     mov  esi, eax
  38.     call push_param
  39. ; retrieving parameters
  40.     mov  esi, params
  41.     xor  edx, edx  ; dl - èä¸ò ïàðàìåòð(1) èëè ðàçäåëèòåëè(0)
  42.                    ; dh - ñèìâîë ñ êîòîðîãî íà÷àëñÿ ïàðàìåòð (1 êàâû÷êè, 0 îñòàëüíîå)
  43.     mov  ecx, 1    ; cl = 1
  44.                    ; ch = 0  ïðîñòî íîëü
  45. .parse:
  46.     lodsb
  47.     test al, al
  48.     jz   .run
  49.     test dl, dl
  50.     jnz  .findendparam
  51.                      ;{åñëè áûë ðàçäåëèòåëü
  52.     cmp  al, ' '
  53.     jz   .parse  ;çàãðóæåí ïðîáåë, ãðóçèì ñëåäóþùèé ñèìâîë
  54.     mov  dl, cl  ;íà÷èíàåòñÿ ïàðàìåòð
  55.     cmp  al, '"'
  56.     jz   @f      ;çàãðóæåíû êàâû÷êè
  57.     mov  dh, ch     ;ïàðàìåòð áåç êàâû÷åê
  58.     dec  esi
  59.     call push_param
  60.     inc  esi
  61.     jmp  .parse
  62.  
  63.   @@:  
  64.     mov  dh, cl     ;ïàðàìåòð â êàâû÷åêàõ
  65.     call push_param ;åñëè íå ïðîáåë çíà÷èò íà÷èíàåòñÿ êàêîé òî ïàðàìåòð
  66.     jmp  .parse     ;åñëè áûë ðàçäåëèòåëü}
  67.  
  68. .findendparam:
  69.     test dh, dh
  70.     jz   @f ; áåç êàâû÷åê
  71.     cmp  al, '"'
  72.     jz   .clear
  73.     jmp  .parse
  74.   @@:  
  75.     cmp  al, ' '
  76.     jnz  .parse
  77.  
  78. .clear:
  79.     lea  ebx, [esi - 1]
  80.     mov  [ebx], ch
  81.     mov  dl, ch
  82.     jmp  .parse
  83.  
  84. .run:
  85.     push argv
  86.     push [argc]
  87.     call main
  88. .exit:
  89.     xor  eax,eax
  90.     dec  eax
  91.     int  0x40
  92.     dd   -1
  93. .crash:
  94.     jmp  .exit
  95. ;============================
  96. push_param:
  97. ;============================
  98. ;parameters
  99. ;  esi - pointer
  100. ;description
  101. ;  procedure increase argc
  102. ;  and add pointer to array argv
  103. ;  procedure changes ebx
  104.     mov  ebx, [argc]
  105.     cmp  ebx, max_parameters
  106.     jae  .dont_add
  107.     mov  [argv+4*ebx], esi
  108.     inc  [argc]
  109. .dont_add:    
  110.     ret
  111.  
  112.    
  113. ;==============================
  114. public argc as '__argc'
  115. public params as '__argv'
  116. public path as '__path'
  117.  
  118. section '.bss'
  119. buf_len = 0x400
  120. max_parameters=0x20
  121. argc     rd 1
  122. argv     rd max_parameters
  123. path     rb buf_len
  124. params   rb buf_len
  125.  
  126. ;section '.data'
  127. ;include_debug_strings ; ALWAYS present in data section
  128.