"Fossies" - the Fresh Open Source Software Archive

Member "fasm/tools/dos/loader.inc" (21 Feb 2022, 1783 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) fasm source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 
    2 segment loader use16
    3 
    4 init:
    5 
    6     mov ax,1687h
    7     int 2Fh
    8     or  ax,ax           ; DPMI installed?
    9     jnz short no_dpmi
   10     test    bl,1            ; 32-bit programs supported?
   11     jz  short no_dpmi
   12     mov word [cs:mode_switch],di
   13     mov word [cs:mode_switch+2],es
   14     mov bx,si           ; allocate memory for DPMI data
   15     mov ah,48h
   16     int 21h
   17     jnc init_protected_mode
   18   init_failed:
   19     call    init_error
   20     db  'error: DPMI initialization failed.',0Dh,0Ah,0
   21   no_dpmi:
   22     call    init_error
   23     db  'error: 32-bit DPMI services are not available.',0Dh,0Ah,0
   24   init_error:
   25     pop si
   26     push    cs
   27     pop ds
   28       display_error:
   29     lodsb
   30     test    al,al
   31     jz  short error_finish
   32     mov dl,al
   33     mov ah,2
   34     int 21h
   35     jmp short display_error
   36       error_finish:
   37     mov ax,4CFFh
   38     int 21h
   39   init_protected_mode:
   40     mov es,ax
   41     mov ds,[ds:2Ch]
   42     mov ax,1
   43     call    far [cs:mode_switch]    ; switch to protected mode
   44     jc  init_failed
   45     mov cx,1
   46     xor ax,ax
   47     int 31h         ; allocate descriptor for code
   48     jc  init_failed
   49     mov si,ax
   50     xor ax,ax
   51     int 31h         ; allocate descriptor for data
   52     jc  init_failed
   53     mov di,ax
   54     mov dx,cs
   55     lar cx,dx
   56     shr cx,8
   57     or  cx,0C000h
   58     mov bx,si
   59     mov ax,9
   60     int 31h         ; set code descriptor access rights
   61     jc  init_failed
   62     mov dx,ds
   63     lar cx,dx
   64     shr cx,8
   65     or  cx,0C000h
   66     mov bx,di
   67     int 31h         ; set data descriptor access rights
   68     jc  init_failed
   69     mov ecx,main
   70     shl ecx,4
   71     mov dx,cx
   72     shr ecx,16
   73     mov ax,7
   74     int 31h         ; set data descriptor base address
   75     jc  init_failed
   76     mov bx,si
   77     int 31h         ; set code descriptor base address
   78     jc  init_failed
   79     mov cx,0FFFFh
   80     mov dx,0FFFFh
   81     mov ax,8            ; set segment limit to 4 GB
   82     int 31h
   83     jc  init_failed
   84     mov bx,di
   85     int 31h
   86     jc  init_failed
   87     mov ax,ds
   88     mov ds,di
   89     mov [psp_selector],es
   90     mov [environment_selector],ax
   91     cli
   92     mov ss,di
   93     mov esp,stack_top
   94     sti
   95     mov es,di
   96     xor eax,eax
   97     mov [memory_handles_count],eax
   98     push    si
   99     push    start
  100     retf
  101 
  102   mode_switch dd ?