"Fossies" - the Fresh Open Source Software Archive

Member "fasm/source/DOS/fasm.asm" (21 Feb 2022, 7322 Bytes) of package /linux/misc/fasm-1.73.30.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Generic Assembler source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "fasm.asm": 1.73.29_vs_1.73.30.

    1 
    2 ; flat assembler interface for DOS
    3 ; Copyright (c) 1999-2022, Tomasz Grysztar.
    4 ; All rights reserved.
    5 
    6     format  MZ
    7     heap    0
    8     stack   8000h
    9     entry   main:start
   10 
   11 include 'modes.inc'
   12 
   13 segment main use16
   14 
   15 start:
   16 
   17     mov ax,ds
   18     mov dx,[2Ch]
   19     push    cs cs
   20     pop ds es
   21     mov [psp_segment],ax
   22     mov [environment_segment],dx
   23 
   24     mov dx,_logo
   25     mov ah,9
   26     int 21h
   27 
   28     cld
   29 
   30     call    go32
   31     use32
   32 
   33     call    get_params
   34     jc  information
   35 
   36     call    init_memory
   37 
   38     mov esi,_memory_prefix
   39     call    display_string
   40     mov eax,[memory_end]
   41     sub eax,[memory_start]
   42     add eax,[additional_memory_end]
   43     sub eax,[additional_memory]
   44     shr eax,10
   45     call    display_number
   46     mov esi,_memory_suffix
   47     call    display_string
   48 
   49     xor ah,ah
   50     int 1Ah
   51     mov ax,cx
   52     shl eax,16
   53     mov ax,dx
   54     mov [start_time],eax
   55 
   56     cmp [mode],dpmi
   57     je  compile
   58     jmp main+(first_segment shr 4):first_gate-first_segment
   59 
   60 compile:
   61     and [preprocessing_done],0
   62     call    preprocessor
   63     or  [preprocessing_done],-1
   64     call    parser
   65     call    assembler
   66     call    formatter
   67 
   68 finish:
   69     call    display_user_messages
   70     movzx   eax,[current_pass]
   71     inc eax
   72     call    display_number
   73     mov esi,_passes_suffix
   74     call    display_string
   75     xor ah,ah
   76     int 1Ah
   77     mov ax,cx
   78     shl eax,16
   79     mov ax,dx
   80     sub eax,[start_time]
   81     mov ebx,100
   82     mul ebx
   83     mov ebx,182
   84     div ebx
   85     or  eax,eax
   86     jz  display_bytes_count
   87     xor edx,edx
   88     mov ebx,10
   89     div ebx
   90     push    edx
   91     call    display_number
   92     mov ah,2
   93     mov dl,'.'
   94     int 21h
   95     pop eax
   96     call    display_number
   97     mov esi,_seconds_suffix
   98     call    display_string
   99       display_bytes_count:
  100     mov eax,[written_size]
  101     call    display_number
  102     mov esi,_bytes_suffix
  103     call    display_string
  104     xor al,al
  105     jmp exit_program
  106 
  107 information:
  108     mov esi,_usage
  109     call    display_string
  110     mov al,1
  111     jmp exit_program
  112 
  113 get_params:
  114     mov [input_file],0
  115     mov [output_file],0
  116     mov [symbols_file],0
  117     mov [memory_setting],0
  118     mov [passes_limit],100
  119     mov [definitions_pointer],predefinitions
  120     push    ds
  121     mov ds,[psp_segment]
  122     mov esi,81h
  123     mov edi,params
  124     find_param:
  125     lodsb
  126     cmp al,20h
  127     je  find_param
  128     cmp al,'-'
  129     je  option_param
  130     cmp al,0Dh
  131     je  all_params
  132     or  al,al
  133     jz  all_params
  134     cmp [es:input_file],0
  135     jne get_output_file
  136     mov [es:input_file],edi
  137     jmp process_param
  138       get_output_file:
  139     cmp [es:output_file],0
  140     jne bad_params
  141     mov [es:output_file],edi
  142     process_param:
  143     cmp al,22h
  144     je  string_param
  145     copy_param:
  146     stosb
  147     lodsb
  148     cmp al,20h
  149     je  param_end
  150     cmp al,0Dh
  151     je  param_end
  152     or  al,al
  153     jz  param_end
  154     jmp copy_param
  155     string_param:
  156     lodsb
  157     cmp al,22h
  158     je  string_param_end
  159     cmp al,0Dh
  160     je  param_end
  161     or  al,al
  162     jz  param_end
  163     stosb
  164     jmp string_param
  165     option_param:
  166     lodsb
  167     cmp al,'m'
  168     je  memory_option
  169     cmp al,'M'
  170     je  memory_option
  171     cmp al,'p'
  172     je  passes_option
  173     cmp al,'P'
  174     je  passes_option
  175     cmp al,'d'
  176     je  definition_option
  177     cmp al,'D'
  178     je  definition_option
  179     cmp al,'s'
  180     je  symbols_option
  181     cmp al,'S'
  182     je  symbols_option
  183     invalid_option:
  184     pop ds
  185     stc
  186     ret
  187     get_option_value:
  188     xor eax,eax
  189     mov edx,eax
  190     get_option_digit:
  191     lodsb
  192     cmp al,20h
  193     je  option_value_ok
  194     cmp al,0Dh
  195     je  option_value_ok
  196     or  al,al
  197     jz  option_value_ok
  198     sub al,30h
  199     jc  bad_params_value
  200     cmp al,9
  201     ja  bad_params_value
  202     imul    edx,10
  203     jo  bad_params_value
  204     add edx,eax
  205     jc  bad_params_value
  206     jmp get_option_digit
  207     option_value_ok:
  208     dec esi
  209     clc
  210     ret
  211     bad_params_value:
  212     stc
  213     ret
  214     memory_option:
  215     lodsb
  216     cmp al,20h
  217     je  memory_option
  218     cmp al,0Dh
  219     je  invalid_option
  220     or  al,al
  221     jz  invalid_option
  222     dec esi
  223     call    get_option_value
  224     jc  invalid_option
  225     or  edx,edx
  226     jz  invalid_option
  227     cmp edx,1 shl (32-10)
  228     jae invalid_option
  229     mov [es:memory_setting],edx
  230     jmp find_param
  231     passes_option:
  232     lodsb
  233     cmp al,20h
  234     je  passes_option
  235     cmp al,0Dh
  236     je  invalid_option
  237     or  al,al
  238     jz  invalid_option
  239     dec esi
  240     call    get_option_value
  241     jc  bad_params
  242     or  edx,edx
  243     jz  invalid_option
  244     cmp edx,10000h
  245     ja  invalid_option
  246     mov [es:passes_limit],dx
  247     jmp find_param
  248     definition_option:
  249     lodsb
  250     cmp al,20h
  251     je  definition_option
  252     cmp al,0Dh
  253     je  bad_params
  254     or  al,al
  255     jz  bad_params
  256     dec esi
  257     push    edi
  258     mov edi,[es:definitions_pointer]
  259     call    convert_definition_option
  260     mov [es:definitions_pointer],edi
  261     pop edi
  262     jc  invalid_option
  263     jmp find_param
  264     symbols_option:
  265     mov [es:symbols_file],edi
  266       find_symbols_file_name:
  267     lodsb
  268     cmp al,20h
  269     jne process_param
  270     jmp find_symbols_file_name
  271     param_end:
  272     dec esi
  273     string_param_end:
  274     xor al,al
  275     stosb
  276     jmp find_param
  277     all_params:
  278     xor al,al
  279     stosb
  280     pop ds
  281     cmp [input_file],0
  282     je  no_input_file
  283     mov eax,[definitions_pointer]
  284     mov byte [eax],0
  285     mov [initial_definitions],predefinitions
  286     clc
  287     ret
  288     bad_params:
  289     pop ds
  290     no_input_file:
  291     stc
  292     ret
  293     convert_definition_option:
  294     mov ecx,edi
  295     xor al,al
  296     stosb
  297       copy_definition_name:
  298     lodsb
  299     cmp al,'='
  300     je  copy_definition_value
  301     cmp al,20h
  302     je  bad_definition_option
  303     cmp al,0Dh
  304     je  bad_definition_option
  305     or  al,al
  306     jz  bad_definition_option
  307     stosb
  308     inc byte [es:ecx]
  309     jnz copy_definition_name
  310       bad_definition_option:
  311     stc
  312     ret
  313       copy_definition_value:
  314     lodsb
  315     cmp al,20h
  316     je  definition_value_end
  317     cmp al,0Dh
  318     je  definition_value_end
  319     or  al,al
  320     jz  definition_value_end
  321     cmp al,'\'
  322     jne definition_value_character
  323     cmp byte [esi],20h
  324     jne definition_value_character
  325     lodsb
  326       definition_value_character:
  327     stosb
  328     jmp copy_definition_value
  329       definition_value_end:
  330     dec esi
  331     xor al,al
  332     stosb
  333     clc
  334     ret
  335 
  336 include '..\version.inc'
  337 
  338 _logo db 'flat assembler  version ',VERSION_STRING,24h
  339 _copyright db 'Copyright (c) 1999-2022, Tomasz Grysztar',0Dh,0Ah,0
  340 
  341 _usage db 0Dh,0Ah
  342        db 'usage: fasm <source> [output]',0Dh,0Ah
  343        db 'optional settings:',0Dh,0Ah
  344        db ' -m <limit>         set the limit in kilobytes for the available memory',0Dh,0Ah
  345        db ' -p <limit>         set the maximum allowed number of passes',0Dh,0Ah
  346        db ' -d <name>=<value>  define symbolic variable',0Dh,0Ah
  347        db ' -s <file>          dump symbolic information for debugging',0Dh,0Ah
  348        db 0
  349 _memory_prefix db '  (',0
  350 _memory_suffix db ' kilobytes memory)',0Dh,0Ah,0
  351 _passes_suffix db ' passes, ',0
  352 _seconds_suffix db ' seconds, ',0
  353 _bytes_suffix db ' bytes.',0Dh,0Ah,0
  354 
  355 error_prefix db 'error: ',0
  356 error_suffix db '.'
  357 cr_lf db 0Dh,0Ah,0
  358 line_number_start db ' [',0
  359 line_data_start db ':',0Dh,0Ah,0
  360 preprocessed_instruction_prefix db 'processed: ',0
  361 
  362 include 'dpmi.inc'
  363 
  364 align 16
  365 first_segment:
  366 
  367 include '..\preproce.inc'
  368 include '..\parser.inc'
  369 include '..\exprpars.inc'
  370 
  371 align 16
  372 second_segment:
  373 
  374 include '..\exprcalc.inc'
  375 include '..\errors.inc'
  376 include '..\symbdump.inc'
  377 
  378 include 'system.inc'
  379 
  380 first_gate:
  381     and [preprocessing_done],0
  382     call    preprocessor
  383     or  [preprocessing_done],-1
  384     call    parser
  385     jmp main+(second_segment shr 4):second_gate-second_segment
  386 first_segment_top = $ - first_segment
  387 
  388 include '..\assemble.inc'
  389 include '..\formats.inc'
  390 include '..\x86_64.inc'
  391 include '..\avx.inc'
  392 
  393 second_gate:
  394     call    assembler
  395     call    formatter
  396     jmp main:finish
  397 
  398 second_segment_top = $ - second_segment
  399 
  400 if first_segment_top>=10000h | second_segment_top>=10000h
  401  if UNREAL_ENABLED>0
  402   UNREAL_ENABLED = -1
  403  else
  404   UNREAL_ENABLED = 0
  405  end if
  406 else
  407  if UNREAL_ENABLED<0
  408   UNREAL_ENABLED = -1
  409  else
  410   UNREAL_ENABLED = 1
  411  end if
  412 end if
  413 
  414 include '..\tables.inc'
  415 include '..\messages.inc'
  416 
  417 align 4
  418 
  419 include '..\variable.inc'
  420 
  421 memory_setting dd ?
  422 start_time dd ?
  423 definitions_pointer dd ?
  424 params rb 100h
  425 predefinitions rb 100h
  426 
  427 mode dw ?
  428 real_mode_segment dw ?
  429 displayed_count dd ?
  430 last_displayed rb 2
  431 preprocessing_done db ?
  432 
  433 segment buffer
  434 
  435 rb 1000h