Subversion Repositories Kolibri OS

Rev

Rev 7859 | Rev 8213 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; flat assembler
  2. ; Copyright (c) 1999-2020, Tomasz Grysztar
  3. ; All rights reserved.
  4.  
  5. init_memory:
  6.  
  7. ;        mov ecx, 16*1024*1024
  8. ;
  9. ; allocate_memory:
  10.         mcall   SF_SYSTEM, SSF_GET_FREE_RAM
  11.         cmp     eax, 0x38000000 shr 9
  12.         jbe     @f
  13.         mov     eax, 0x38000000 shr 9
  14. @@:
  15.         shl     eax, 9
  16.         xchg    eax, ecx
  17.         mov     [memory_setting],ecx
  18.         mcall   SF_SYS_MISC, SSF_MEM_ALLOC
  19.         or      eax,eax
  20.         jz      out_of_memory
  21.         mov     [memblock], eax
  22.         mov     [additional_memory],eax
  23.         add     eax,[memory_setting]
  24.         mov     [memory_end],eax
  25.         mov     eax,[memory_setting]
  26.         shr     eax,2
  27.         add     eax,[additional_memory]
  28.         mov     [additional_memory_end],eax
  29.         mov     [memory_start],eax
  30.         retn
  31.  
  32. exit_program:
  33.         cmp     [_mode],NORMAL_MODE
  34.         jne     @f
  35.         mcall   SF_SYS_MISC, SSF_MEM_FREE, [memblock]
  36.         mov     esp,[processing_esp]
  37.         jmp     still
  38. @@:
  39.         or      eax,-1
  40.         mcall
  41.  
  42. get_tickcount:
  43.         push    ebx
  44.         mcall   SF_SYSTEM_GET,SSF_TIME_COUNT
  45.         imul    eax,10
  46.         pop     ebx
  47.         retn
  48.  
  49. macro BCDtoHEX al {
  50.         aam     16
  51.         aad     10 }
  52.  
  53. make_timestamp:
  54.         mcall   SF_GET_SYS_DATE ; $00SSMMHH (BCD)
  55.         mov     edx,eax
  56.         shr     eax,16
  57.         BCDtoHEX al
  58.         push    eax             ; SECONDS
  59.         mov     al,dh
  60.         BCDtoHEX al
  61.         push    eax             ; MINUTES
  62.         mov     al,dl
  63.         BCDtoHEX al
  64.         push    eax             ; HOURS
  65.         mcall   SF_GET_SYS_DATE ; $00DDMMYY (BCD)
  66.         mov     edx,eax
  67.         shr     eax,16
  68.         BCDtoHEX al
  69.         push    eax             ; DAY
  70.         mov     al,dl
  71.         BCDtoHEX al
  72.         add     eax,2000
  73.         push    eax             ; YEAR
  74.         mov     ecx,eax
  75.         mov     al,dh
  76.         BCDtoHEX al
  77.         push    eax             ; MONTH
  78. ; ecx: YEAR
  79. ; stack: MONTH, YEAR, DAY, HOURS, MINUTES, SECONDS, retaddr
  80.         mov     eax,ecx
  81.         sub     eax,1970
  82.         mov     ebx,365
  83.         mul     ebx
  84.         mov     ebp,eax
  85.         mov     eax,ecx
  86.         sub     eax,1969
  87.         shr     eax,2
  88.         add     ebp,eax
  89.         mov     eax,ecx
  90.         xor     edx,edx
  91.         sub     eax,1901
  92.         mov     ebx,100
  93.         div     ebx
  94.         sub     ebp,eax
  95.         mov     eax,ecx
  96.         xor     edx,edx
  97.         sub     eax,1601
  98.         mov     ebx,400
  99.         div     ebx
  100.         add     ebp,eax
  101.         pop     ecx
  102. ; ecx: MONTH
  103. ; stack: YEAR, DAY, HOURS, MINUTES, SECONDS, retaddr
  104.         mov     eax,ecx
  105.         dec     eax
  106.         mov     ebx,30
  107.         mul     ebx
  108.         add     ebp,eax
  109.         cmp     ecx,8
  110.         jbe     months_correction
  111.         mov     eax,ecx
  112.         sub     eax,7
  113.         shr     eax,1
  114.         add     ebp,eax
  115.         mov     ecx,8
  116.       months_correction:
  117.         mov     eax,ecx
  118.         shr     eax,1
  119.         add     ebp,eax
  120.         cmp     ecx,2
  121.         pop     ecx
  122. ; ecx: YEAR
  123. ; stack: DAY, HOURS, MINUTES, SECONDS, retaddr
  124.         jbe     day_correction_ok
  125.         sub     ebp,2
  126.         test    ecx,11b
  127.         jnz     day_correction_ok
  128.         xor     edx,edx
  129.         mov     eax,ecx
  130.         mov     ebx,100
  131.         div     ebx
  132.         or      edx,edx
  133.         jnz     day_correction
  134.         mov     eax,ecx
  135.         mov     ebx,400
  136.         div     ebx
  137.         or      edx,edx
  138.         jnz     day_correction_ok
  139.       day_correction:
  140.         inc     ebp
  141.       day_correction_ok:
  142.         pop     eax
  143. ; eax: DAY
  144. ; stack: HOURS, MINUTES, SECONDS, retaddr
  145.         dec     eax
  146.         add     eax,ebp
  147.         mov     ebx,24
  148.         mul     ebx
  149.         pop     ecx
  150. ; ecx: HOURS
  151. ; stack: MINUTES, SECONDS, retaddr
  152.         add     eax,ecx
  153.         mov     ebx,60
  154.         mul     ebx
  155.         pop     ecx
  156. ; ecx: MINUTES
  157. ; stack: SECONDS, retaddr
  158.         add     eax,ecx
  159.         mov     ebx,60
  160.         mul     ebx
  161.         pop     ecx
  162. ; ecx: SECONDS
  163. ; stack: retaddr
  164.         add     eax,ecx
  165.         retn
  166.  
  167. symbol_dump:
  168.  
  169.         push    edi
  170.         mov     edx,[memory_end]
  171.       symb_dump:
  172.         cmp     edx,[labels_list]
  173.         jbe     symbols_dumped
  174.         sub     edx,LABEL_STRUCTURE_SIZE
  175.         cmp     dword [edx+24],0
  176.         je      symb_dump       ; do not dump anonymous symbols
  177.         test    byte [edx+8],1
  178.         jz      symb_dump       ; do not dump symbols that didn't get defined
  179.         mov     ax,[current_pass]
  180.         cmp     ax,[edx+16]
  181.         jne     symb_dump
  182.         test    byte [edx+8],4 or 2
  183.         jnz     symb_dump       ; do not dump assembly-time variables
  184.                                 ; do not dump variables defined with '='
  185.         cmp     word [edx+12], 0
  186.         jnz     symb_dump       ; do not dump register-based variables
  187.  
  188.         mov     al, '0'
  189.         stosb
  190.         mov     al, 'x'
  191.         stosb
  192.         mov     eax, [edx+4]
  193.         mov     ecx, 8
  194. @@:
  195.         rol     eax, 4
  196.         test    al, 0xF
  197.         loopz   @b
  198.         jz      .nohigh
  199.         inc     ecx
  200. @@:
  201.         push    eax
  202.         and     al, 0xF
  203.         cmp     al, 10
  204.         sbb     al, 69h
  205.         das
  206.         stosb
  207.         pop     eax
  208.         rol     eax, 4
  209.         loop    @b
  210.         mov     eax, [edx]
  211.         mov     ecx, 8
  212.         jmp     .low
  213. .nohigh:
  214.         mov     eax, [edx]
  215.         mov     ecx, 8
  216. @@:
  217.         rol     eax, 4
  218.         test    al, 0xF
  219.         loopz   @b
  220.         inc     ecx
  221. .low:
  222.         push    eax
  223.         and     al, 0xF
  224.         cmp     al, 10
  225.         sbb     al, 69h
  226.         das
  227.         stosb
  228.         pop     eax
  229.         rol     eax, 4
  230.         loop    .low
  231.  
  232.         mov     al, ' '
  233.         stosb
  234.  
  235.         mov     esi,[edx+24]
  236.         movzx   ecx,byte [esi-1]
  237.         rep     movsb
  238.  
  239.         mov     ax,0A0Dh
  240.         stosw
  241.  
  242.         jmp     symb_dump
  243.  
  244.       symbols_dumped:
  245.         mov     edx,dbgfilename
  246.         push    esi edi
  247.         mov     esi, outfile
  248.         mov     edi, edx
  249. @@:
  250.         lodsb
  251.         stosb
  252.         test    al, al
  253.         jnz     @b
  254.         lea     ecx, [edi-1]
  255. @@:
  256.         dec     edi
  257.         cmp     edi, edx
  258.         jb      @f
  259.         cmp     byte [edi], '/'
  260.         jz      @f
  261.         cmp     byte [edi], '.'
  262.         jnz     @b
  263.         mov     ecx, edi
  264. @@:
  265.         mov     dword [ecx], '.dbg'
  266.         mov     byte [ecx+4], 0
  267.         pop     edi esi
  268.         call    create
  269.         mov     edx,[esp]
  270.         mov     ecx,edi
  271.         sub     ecx,edx
  272.         call    write
  273.         call    close
  274.         pop     edi
  275.  
  276.         retn
  277.  
  278. get_environment_variable:
  279.         mov     ecx,[memory_end]
  280.         sub     ecx,edi
  281.         cmp     ecx,7
  282.         jb      out_of_memory
  283.         cmp     dword[esi],'INCL'
  284.         jne     .finish
  285.         mov     esi,_ramdisk
  286.         mov     ecx,6
  287.         cld
  288.         rep     movsb
  289.   .finish:
  290. ;       stc
  291.         retn
  292.  
  293. alloc_handle:
  294. ; in:
  295. ; out: ebx = file handle
  296. ; on error: return to caller of caller with cf set
  297. ; preserves: esi, edi
  298.         call    make_fullpaths
  299.         mov     ebx, file_IO_slots+4
  300.         jmp     check_file_IO_slot
  301.       next_file_IO_slot:
  302.         add     ebx, 4+20+MAX_PATH
  303.         cmp     ebx, file_IO_end
  304.         jae     send_error_to_caller_of_caller
  305.       check_file_IO_slot:
  306.         cmp     [ebx+FILEIO.cmd], -1
  307.         jnz     next_file_IO_slot
  308.         and     [ebx+FILEIO.offset], 0
  309.         and     [ebx+FILEIO.flags], 0
  310.       adapt_path:
  311.         push    esi edi ecx
  312.         mov     esi, fullpath_open
  313.         lea     edi, [ebx+namedFILEIO.name]
  314.         mov     ecx, MAX_PATH
  315.       copy_path:
  316.         lodsb
  317.         cmp     al,'\'
  318.         jne     path_char_ok
  319.         mov     al,'/'
  320.       path_char_ok:
  321.         stosb
  322.         or      al,al
  323.         loopnz  copy_path
  324.         pop     ecx edi esi
  325.         jz      adapt_path.done
  326.       send_error_to_caller_of_caller:
  327.         stc
  328.         pop     eax
  329.       adapt_path.done:
  330.         ret
  331.  
  332. create:
  333. ; in:
  334. ; out: ebx = file handle, cf set on error
  335. ; preserves: esi, edi
  336.         call    alloc_handle
  337.         and     [ebx+FILEIO.filesize], 0
  338.         mov     [ebx+FILEIO.cmd], SSF_CREATE_FILE
  339.         retn
  340.  
  341.  
  342. open:
  343. ; in:
  344. ; out: ebx = file handle, cf set on error
  345. ; preserves: esi, edi
  346.         call    alloc_handle
  347.         mov     [ebx+FILEIO.cmd], SSF_GET_INFO
  348.         and     [ebx+FILEIO.count], 0
  349.         mov     [ebx+FILEIO.buffer], fileinfo
  350.         push    ebx
  351.         mcall   SF_FILE
  352.         pop     ebx
  353.         test    eax, eax
  354.         jnz     fail_close
  355.         mov     eax, dword[fileinfo.size]
  356.         mov     [ebx+FILEIO.filesize], eax
  357.         and     [ebx+FILEIO.cmd], SSF_READ_FILE
  358.         retn
  359.  
  360. fail_close:
  361.         stc
  362. close:
  363. ; in: ebx = file handle
  364. ; preserves: ebx, esi, edi, cf
  365.         mov     [ebx+FILEIO.cmd], -1 ; close handle
  366.         retn
  367. write:
  368. ; in: ebx = file handle, edx - data, ecx = number of bytes
  369. ; out: cf set on error
  370. ; preserves: ebx, esi, edi
  371.         call    read_write
  372.         mov     [ebx+FILEIO.cmd], SSF_WRITE_FILE
  373.         jmp     read_write_check_S_OK
  374. read:
  375. ; in: ebx = file handle, edx - buffer, ecx = number of bytes
  376. ; out: cf set on error
  377. ; preserves: ebx, esi, edi
  378.         call    read_write
  379.         cmp     eax, 6
  380.         jz      read_write_OK
  381.       read_write_check_S_OK:
  382.         test    eax, eax
  383.         jz      read_write_OK
  384.         stc
  385.         retn
  386.       read_write:
  387.         mov     [ebx+FILEIO.count], ecx
  388.         mov     [ebx+FILEIO.buffer], edx
  389.         push    ebx
  390.         mcall   SF_FILE
  391.         xchg    eax, [esp]
  392.         add     [eax+FILEIO.offset], ebx
  393.         adc     [eax+FILEIO.offshigh], 0
  394.         mov     ebx, eax
  395.         pop     eax
  396.       read_write_OK:
  397.         retn
  398.  
  399.  
  400. make_fullpaths:
  401.         pusha
  402.         push    edx
  403.         mov     esi,edx
  404.         mov     ecx, MAX_PATH
  405.       copy_edxpath:
  406.         lodsb
  407.         cmp     al,'\'
  408.         jne     edxpath_char_ok
  409.         mov     byte[esi-1],'/'
  410.       edxpath_char_ok:
  411.         or      al,al
  412.         loopnz  copy_edxpath
  413.  
  414.         mov     esi,path              ; open
  415. ;       DEBUGF  "   '%s'",esi
  416.         mov     edi,fullpath_open
  417.         cld
  418.       newc1:
  419.         movsb
  420.         cmp     byte[esi],0;' '
  421.         jne     newc1
  422.         mov     esi,[esp]
  423.  
  424.         cmp     byte[esi],'/'
  425.         jne     @f
  426.         cmp     byte[esi],'\'
  427.         jne     @f
  428.         mov     edi,fullpath_open
  429.  
  430.     @@:
  431.         lodsb
  432.         stosb
  433.         cmp     al,0
  434.         jne     @b
  435.  
  436.         mov     esi,path              ; write
  437.         mov     edi,fullpath_write
  438.         cld
  439.       newc2:
  440.         movsb
  441.         cmp     byte[esi],0;' '
  442.         jne     newc2
  443.         mov     esi,[esp]
  444.  
  445.         cmp     byte[esi],'/'
  446.         jne     @f
  447.         cmp     byte[esi],'\'
  448.         jne     @f
  449.         mov     edi,fullpath_write
  450.  
  451.     @@:
  452.         lodsb
  453.         stosb
  454.         cmp     al,0
  455.         jne     @b
  456.  
  457.         mov     esi,path              ; start
  458.         mov     edi,file_io_start.path
  459.         cld
  460.       newc3:
  461.         movsb
  462.         cmp  byte[esi],0;' '
  463.         jne  newc3
  464.         pop     esi
  465.  
  466.         cmp     byte[esi],'/'
  467.         jne     @f
  468.         cmp     byte[esi],'\'
  469.         jne     @f
  470.         mov     edi,file_io_start.path
  471.  
  472.     @@:
  473.         lodsb
  474.         stosb
  475.         cmp     al,0
  476.         jne     @b
  477.         popa
  478.         retn
  479. lseek:
  480. ; in: ebx = file handle, al = method, edx = delta offset
  481. ; out: cf set on error
  482. ; preserves: ebx, esi, edi
  483.         cmp     al,FILE_BEGIN
  484.         jnz     @f
  485.         and     [ebx+FILEIO.offset], 0
  486.         jmp     .common
  487.     @@: cmp     al,FILE_END
  488.         jnz     @f
  489.         mov     eax, [ebx+FILEIO.filesize]
  490.         mov     [ebx+FILEIO.offset], eax
  491.         jmp     .common
  492.     @@:
  493.     .common:
  494.         add     [ebx+FILEIO.offset], edx
  495.         retn
  496.  
  497. display_character:
  498.         pusha
  499.         cmp     [_mode],NORMAL_MODE
  500.         jne     @f
  501.         cmp     al,$D
  502.         jz      dc2
  503.         cmp     al,$A
  504.         jnz     dc1
  505.         and     [textxy],0x0000FFFF
  506.         add     [textxy], 8 shl 16 and 0xFFFF0000 + 18
  507.         popa
  508.         retn
  509. dc1:
  510.         mov     [dc],al
  511.         mov     eax,[textxy]
  512.         cmp     ax,word[bottom_right]
  513.         ja      dc2
  514.         shr     eax,16
  515.         cmp     ax,word[bottom_right+2]
  516.         ja      dc2
  517.         mov     ecx,[sc.work_text]
  518.         or      ecx,$10000000
  519.         mcall   SF_DRAW_TEXT,[textxy],,dc,1
  520.         add     [textxy],0x00080000
  521. dc2:
  522.         popa
  523.         retn
  524. @@:
  525.         mov     cl,al
  526.         mcall   SF_BOARD,SSF_DEBUG_WRITE
  527.         popa
  528.         retn
  529.  
  530.  
  531. display_string:
  532. ; in:
  533. ;  esi - ASCIIZ string
  534. ; preserves: ebx, esi
  535.         push    esi
  536. @@:     lodsb
  537.         test    al,al
  538.         je      @f
  539.         call    display_character
  540.         jmp     @b
  541. @@:
  542.         pop     esi
  543.         retn
  544.  
  545. display_number:
  546.         push    ebx
  547.         mov     ecx,1000000000
  548.         xor     edx,edx
  549.         xor     bl,bl
  550. display_loop:
  551.         div     ecx
  552.         push    edx
  553.         cmp     ecx,1
  554.         je      display_digit
  555.         or      bl,bl
  556.         jnz     display_digit
  557.         or      al,al
  558.         jz      digit_ok
  559.         not     bl
  560. display_digit:
  561.         add     al,'0'
  562.         push    ebx ecx
  563.         call    display_character
  564.         pop     ecx ebx
  565. digit_ok:
  566.         mov     eax,ecx
  567.         xor     edx,edx
  568.         mov     ecx,10
  569.         div     ecx
  570.         mov     ecx,eax
  571.         pop     eax
  572.         or      ecx,ecx
  573.         jnz     display_loop
  574.         pop     ebx
  575.         retn
  576.  
  577. display_user_messages:
  578. ;    push   [skinh]
  579. ;    pop    [textxy]
  580. ;    add    [textxy], 7 shl 16 +53
  581.         mov     [displayed_count],0
  582.         call    show_display_buffer
  583.         cmp     [displayed_count],1
  584.         jb      line_break_ok
  585.         je      make_line_break
  586.         mov     ax,word[last_displayed]
  587.         cmp     ax,0A0Dh
  588.         je      line_break_ok
  589.         cmp     ax,0D0Ah
  590.         je      line_break_ok
  591. make_line_break:
  592.         mov     esi,crlf
  593.         call    display_string
  594. line_break_ok:
  595.         retn
  596.  
  597. display_block:
  598. ; in:
  599. ;  esi - string
  600. ;  ecx = string length
  601.         push    esi
  602. @@:     lodsb
  603.         call    display_character
  604.         loop    @b
  605.         pop     esi
  606.         retn
  607.  
  608. fatal_error:
  609. ; no return, trashes stack
  610.  
  611.         mov     esi,error_prefix
  612.         call    display_string
  613.         pop     esi
  614.         call    display_string
  615.         mov     esi,error_suffix
  616.         call    display_string
  617.         mov     esi,crlf
  618.         call    display_string
  619.         mov     al,0FFh
  620.         jmp     exit_program
  621.  
  622. assembler_error:
  623.         call    display_user_messages
  624.         push    0
  625.         mov     ebx,[current_line]
  626. get_error_lines:
  627.         push    ebx
  628.         test    byte [ebx+7],80h
  629.         jz      display_error_line
  630.         mov     edx,ebx
  631. find_definition_origin:
  632.         mov     edx,[edx+12]
  633.         test    byte [edx+7],80h
  634.         jnz     find_definition_origin
  635.         push    edx
  636.         mov     ebx,[ebx+8]
  637.         jmp     get_error_lines
  638. display_error_line:
  639.         mov     esi,[ebx]
  640.         call    display_string
  641.         mov     esi,line_number_start
  642.         call    display_string
  643.         mov     eax,[ebx+4]
  644.         and     eax,7FFFFFFFh
  645.         call    display_number
  646.         mov     al,']'
  647.         call    display_character
  648.         pop     esi
  649.         cmp     ebx,esi
  650.         je      line_number_ok
  651.         mov     al,' '
  652.         call    display_character
  653.         push    esi
  654.         mov     esi,[esi]
  655.         movzx   ecx,byte [esi]
  656.         inc     esi
  657.         call    display_block
  658.         mov     esi,line_number_start
  659.         call    display_string
  660.         pop     esi
  661.         mov     eax,[esi+4]
  662.         and     eax,7FFFFFFFh
  663.         call    display_number
  664.         mov     al,']'
  665.         call    display_character
  666. line_number_ok:
  667.         mov     esi,line_data_start
  668.         call    display_string
  669.         mov     esi,ebx
  670.         mov     edx,[esi]
  671.         call    open
  672.         mov     al,2
  673.         xor     edx,edx
  674.         call    lseek
  675.         mov     edx,[esi+8]
  676.         sub     eax,edx
  677.         push    eax
  678.         xor     al,al
  679.         call    lseek
  680.         mov     ecx,[esp]
  681.         mov     edx,[additional_memory]
  682.         lea     eax,[edx+ecx]
  683.         cmp     eax,[additional_memory_end]
  684.         ja      out_of_memory
  685.         call    read
  686.         call    close
  687.         pop     ecx
  688.         mov     esi,[additional_memory]
  689. get_line_data:
  690.         mov     al,[esi]
  691.         cmp     al,$A
  692.         je      display_line_data
  693.         cmp     al,$D
  694.         je      display_line_data
  695.         cmp     al,$1A
  696.         je      display_line_data
  697.         or      al,al
  698.         jz      display_line_data
  699.         inc     esi
  700.         loop    get_line_data
  701. display_line_data:
  702.         mov     ecx,esi
  703.         mov     esi,[additional_memory]
  704.         sub     ecx,esi
  705.         call    display_block
  706.         mov     esi,crlf
  707.         call    display_string
  708.         pop     ebx
  709.         or      ebx,ebx
  710.         jnz     display_error_line
  711.         mov     esi,error_prefix
  712.         call    display_string
  713.         pop     esi
  714.         call    display_string
  715.         mov     esi,error_suffix
  716.         call    display_string
  717.         jmp     exit_program