;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; DOS16.ASM ; 16-bit protected mode DOS emulation ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME dos16 GateSize = 16 INCLUDE system.def INCLUDE protseg.def INCLUDE driver.def INCLUDE int.def INCLUDE user.def INCLUDE virt.def INCLUDE os.def INCLUDE user.inc INCLUDE virt.inc INCLUDE os.inc INCLUDE dos.inc .386p code SEGMENT byte public use16 'CODE' assume cs:code extrn get_virt_psp:near extrn set_virt_psp:near extrn get_prot_psp:near extrn set_prot_psp:near extrn get_prot_dta:near extrn set_prot_dta:near extrn get_system_date:near extrn set_system_date:near extrn get_system_time:near extrn set_system_time:near extrn strategy:near extrn exit_code:near extrn dos_version:near extrn control_c_check:near extrn switch_char:near extrn dos_write_char:near extrn dos_read_key:near extrn dos_read_key_echo:near extrn dos_con_io:near extrn dos_key_state:near extrn ioctl:near extrn close_handle:near extrn move_pointer:near extrn dupl_handle:near extrn force_dupl_handle:near extrn get_drive_allocation:near extrn select_drive:near extrn get_drive:near extrn find_first_file:near extrn find_next:near extrn date_time_handle:near PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: KEY_IO ; ; DESCRIPTION: DOS function 0A ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; key_io PROC far push cx push es push di mov es,[bp].pm_ds mov di,dx movzx cx,byte ptr es:[di] add di,2 ReadConsole dec ax dec di mov es:[di],al pop di pop es pop cx mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 ret key_io ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DOS_IO_FLUSH ; ; DESCRIPTION: DOS function 0C ; ; PARAMETERS: AL KEY FUNCTION ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dos_io_flush PROC far FlushKeyboard mov ax,[bp].vm_eax mov bl,al xor bh,bh mov byte ptr [bp].vm_eax,bh add bx,bx cmp bx,20h jnc dos_flush_end jmp word ptr cs:[bx].dos_tab dos_flush_end: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx ret dos_io_flush ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ALLOCATE_MEM ; ; DESCRIPTION: DOS function 48 ; ; PARAMETERS: BX NUMBER OF PARAGRAPH ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_mem PROC far push ds push bx push ecx push edx push eax movzx eax,bx shl eax,4 AllocateLocalLinear cmp eax,10000h jz allocate_mem_single jc allocate_mem_single allocate_mem_multiple: mov ecx,eax dec ecx shr ecx,16 inc cx AllocateMultipleLdt jmp allocate_mem_setup_ldt allocate_mem_single: mov cx,1 AllocateLdt allocate_mem_setup_ldt: push cx mov cx,thread_sel mov ds,cx mov ds,ds:p_ldt_sel pop cx push bx allocate_mem_ldt_loop: cmp cx,1 je allocate_mem_final_ldt mov word ptr [bx],0FFFFh mov [bx+2],edx push ax mov al,0F2h xchg al,[bx+5] mov byte ptr [bx+6],0 mov [bx+7],al pop ax add edx,10000h jmp allocate_mem_next_ldt allocate_mem_final_ldt: dec ax mov [bx],ax mov [bx+2],edx mov al,0F2h xchg al,[bx+5] mov byte ptr [bx+6],0 mov [bx+7],al allocate_mem_next_ldt: add bx,8 loop allocate_mem_ldt_loop pop bx or bx,7 pop eax mov ax,bx pop edx pop ecx pop bx pop ds and byte ptr [bp].vm_eflags,NOT 1 ret allocate_mem ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RESIZE_MEM ; ; DESCRIPTION: DOS function 4A ; ; PARAMETERS: BX NUMBER OF PARAGRAPH ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; resize_mem PROC far int 3 and byte ptr [bp].vm_eflags,NOT 1 ret resize_mem ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_PSP ; ; DESCRIPTION: DOS function 51,62 ; ; PARAMETERS: BX PSP ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_psp PROC far call get_prot_psp and byte ptr [bp].vm_eflags,NOT 1 ret get_psp ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_PSP ; ; DESCRIPTION: DOS function 50 ; ; PARAMETERS: BX PSP ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_psp PROC far call set_prot_psp and byte ptr [bp].vm_eflags,NOT 1 ret set_psp ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DTA ; ; DESCRIPTION: DOS function 2F ; ; PARAMETERS: ES:BX DTA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_dta PROC far push dx call get_prot_dta mov es,dx pop dx and byte ptr [bp].vm_eflags,NOT 1 ret get_dta ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_DTA ; ; DESCRIPTION: DOS function 1A ; ; PARAMETERS: DS:DX DTA ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_dta PROC far push ebx push dx movzx ebx,dx mov dx,ds call set_prot_dta pop dx pop ebx and byte ptr [bp].vm_eflags,NOT 1 ret set_dta ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: PARSE_FILE ; ; DESCRIPTION: DOS function 29 ; ; PARAMETERS: ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; parse_file PROC far and byte ptr [bp].vm_eflags,NOT 1 ret parse_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: LOAD_PROGRAM ; ; DESCRIPTION: DOS function 4B ; ; PARAMETERS: ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; load_program PROC far push si push di SimSti mov si,dx mov di,[bp].vm_ebx les di,es:[di+2] push es push di ; push ds push cx push si mov ax,es mov ds,ax mov si,di movzx cx,byte ptr [si] movzx eax,cx inc eax AllocateLocalMem xor di,di inc si rep movsb xor al,al stosb xor di,di pop si pop cx pop ds LoadExe ; pushf FreeMem popf pop di pop es jc load_fail ; and byte ptr [bp].vm_eflags,1 jmp load_done load_fail: or byte ptr [bp].vm_eflags,1 load_done: pop di pop si ret load_program ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: END_PROGRAM ; ; DESCRIPTION: DOS function 4C ; ; PARAMETERS: ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; end_program: UnloadExe PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_INDOS_FLAG ; ; DESCRIPTION: DOS function 34 ; ; PARAMETERS: ES:BX Address to indos flag ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_indos_flag PROC far mov bx,dos_vm_sel mov es,bx mov bx,OFFSET indos_flag and byte ptr [bp].vm_eflags,NOT 1 ret get_indos_flag ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DOS5D ; ; DESCRIPTION: DOS function 5D ; ; PARAMETERS: ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dos5d PROC far cmp al,6 je crit crit: mov si,dos_vm_sel mov ds,si mov si,OFFSET critical_flag and byte ptr [bp].vm_eflags,NOT 1 ret dos5d ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_INT ; ; DESCRIPTION: DOS function 35 ; ; PARAMETERS: ES:BX ADDRESS ; AL VECTOR NR ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_int PROC far push di GetPMInt mov bx,di pop di and byte ptr [bp].vm_eflags,NOT 1 ret get_int ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_INT ; ; DESCRIPTION: DOS function 25 ; ; PARAMETERS: DS:DX ADDRESS ; AL VECTOR NR ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_int PROC far push es push di mov di,ds mov es,di mov di,dx SetPMInt pop di pop es and byte ptr [bp].vm_eflags,NOT 1 ret set_int ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DISPLAY_STRING ; ; DESCRIPTION: DOS function 9 ; ; PARAMETERS: DS:DX $ - TERMINATED STRING ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; display_string PROC far push es push di mov es,[bp].pm_ds movzx edi,dx WriteDosString pop di pop es and byte ptr [bp].vm_eflags, NOT 1 ret display_string ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FILE_ATTRIBUTE ; ; DESCRIPTION: DOS function 43 ; ; PARAMETERS: DS:DX PATH NAME ; CX ATTRIBUTE ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; file_attribute PROC far or al,al jz get_file_attrib cmp al,1 je set_file_attrib mov ax,1 or byte ptr [bp].vm_eflags,1 ret get_file_attrib: push es push di mov bx,ds mov es,bx mov di,dx GetFileAttribute pop di pop es jnc file_attrib_ok mov ax,2 mov bx,[bp].vm_ebx or byte ptr [bp].vm_eflags,1 ret set_file_attrib: int 3 mov ax,1 or byte ptr [bp].vm_eflags,1 ret file_attrib_ok: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 ret file_attribute ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CREATE_HANDLE ; ; DESCRIPTION: DOS function 3C ; ; PARAMETERS: DS:DX FILENAME ; CX FILE ATTRIBUTE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume es:psp_seg create_handle PROC far push es push di call get_prot_psp mov es,bx push cx mov di,es:psp_handleads mov cx,es:psp_handlesize mov al,0FFh repne scasb pop cx jz create_handle_found or byte ptr [bp].vm_eflags,1 mov ax,4 jmp create_handle_done create_handle_found: dec di push es push di mov es,[bp].pm_ds mov di,dx CreateFile pop di pop es jnc create_handle_ok or byte ptr [bp].vm_eflags,1 mov ax,2 jmp create_handle_done create_handle_ok: mov es:[di],bl sub di,es:psp_handleads mov ax,di and byte ptr [bp].vm_eflags,NOT 1 create_handle_done: mov bx,[bp].vm_ebx pop di pop es ret create_handle ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: OPEN_HANDLE ; ; DESCRIPTION: DOS function 3D ; ; PARAMETERS: DS:DX FILENAME ; AL ACCESS CODE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assume es:psp_seg open_handle PROC far push es push cx push di call get_prot_psp mov es,bx mov di,es:psp_handleads mov cx,es:psp_handlesize mov al,0FFh repne scasb jz open_handle_found or byte ptr [bp].vm_eflags,1 mov ax,4 jmp open_handle_done open_handle_found: dec di push es push di mov bx,ds mov es,bx mov di,dx mov cl,[bp].vm_eax OpenFile pop di pop es jnc open_handle_ok or byte ptr [bp].vm_eflags,1 mov ax,2 jmp open_handle_done open_handle_ok: mov es:[di],bl sub di,es:psp_handleads mov ax,di and byte ptr [bp].vm_eflags,NOT 1 open_handle_done: mov bx,[bp].vm_eflags pop di pop cx pop es ret open_handle ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: READ_HANLE ; ; DESCRIPTION: DOS function 3F ; ; PARAMETERS: DS:DX BUFFER ; BX FILE HANDLE ; CX BYTES ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; read_handle PROC far push es call get_prot_psp mov es,bx mov ax,[bp].vm_ebx cmp ax,es:psp_handlesize jc read_handle_inrange mov ax,6 or byte ptr [bp].vm_eflags, 1 jmp read_handle_done read_handle_inrange: mov bx,es:psp_handleads add bx,ax movzx bx,byte ptr es:[bx] cmp bx,0FFh jne read_handle_read mov ax,6 or byte ptr [bp].vm_eflags, 1 jmp read_handle_done read_handle_read: push di push bx mov bx,ds mov es,bx pop bx mov di,dx ReadFile pop di jnc read_handle_ok mov ax,5 or byte ptr [bp].vm_eflags, 1 jmp read_handle_done read_handle_ok: and byte ptr [bp].vm_eflags,NOT 1 read_handle_done: mov ebx,[bp].vm_ebx pop es ret read_handle ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WRITE_HANLE ; ; DESCRIPTION: DOS function 40 ; ; PARAMETERS: DS:DX BUFFER ; BX FILE HANDLE ; CX BYTES ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_handle PROC far push es call get_prot_psp mov es,bx mov ax,[bp].vm_ebx cmp ax,es:psp_handlesize jc write_handle_inrange mov ax,6 or byte ptr [bp].vm_eflags, 1 jmp write_handle_done write_handle_inrange: mov bx,es:psp_handleads add bx,ax movzx bx,byte ptr es:[bx] cmp bx,0FFh jne write_handle_write mov ax,6 or byte ptr [bp].vm_eflags, 1 jmp write_handle_done write_handle_write: or cx,cx jz set_file_size push di mov di,ds mov es,di mov di,dx WriteFile pop di jnc write_handle_ok mov ax,5 or byte ptr [bp].vm_eflags, 1 jmp write_handle_done set_file_size: GetFilePos SetFileSize mov eax,[bp].vm_eax write_handle_ok: and byte ptr [bp].vm_eflags,NOT 1 write_handle_done: mov ebx,[bp].vm_ebx pop es ret write_handle ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DELETE_FILE ; ; DESCRIPTION: DOS function 41 ; ; PARAMETERS: DS:DX FILENAME ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; delete_file PROC far push es push di mov es,[bp].pm_ds mov di,dx DeleteFile pop di pop es jc delete_file_fail and byte ptr [bp].vm_eflags,NOT 1 jmp delete_file_done delete_file_fail: or byte ptr [bp].vm_eflags,1 delete_file_done: ret delete_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_CUR_DIR ; ; DESCRIPTION: DOS function 3B ; ; PARAMETERS: DS:DX PATH NAME ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_cur_dir PROC far push di push es mov es,[bp].pm_ds mov di,dx SetCurDir pop es pop di jnc setup_cur_do mov ax,3 mov bx,[bp].vm_ebx or byte ptr [bp].vm_eflags,1 ret setup_cur_do: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 ret set_cur_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_CUR_DIR ; ; DESCRIPTION: DOS function 47 ; ; PARAMETERS: DS:DX PATH NAME ; DL DRIVE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_cur_dir PROC far push di push es mov es,[bp].pm_ds mov di,si mov al,dl sub al,1 jnc get_cur_not_default GetCurDrive get_cur_not_default: GetCurDir pop es pop di jc get_cur_dir_fail mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 ret get_cur_dir_fail: mov ax,15 or byte ptr [bp].vm_eflags,1 ret get_cur_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: MAKE_DIR ; ; DESCRIPTION: DOS function 39 ; ; PARAMETERS: DS:DX PATH NAME ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; make_dir PROC far push di push es mov es,[bp].pm_ds mov di,dx MakeDir pop es pop di jnc make_dir_done mov ax,3 mov bx,[bp].vm_ebx or byte ptr [bp].vm_eflags,1 ret make_dir_done: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 ret make_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: REMOVE_DIR ; ; DESCRIPTION: DOS function 3A ; ; PARAMETERS: DS:DX PATH NAME ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; remove_dir PROC far push di push es mov es,[bp].pm_ds mov di,dx RemoveDir pop di pop es jnc remove_dir_done mov ax,3 mov bx,[bp].vm_ebx or byte ptr [bp].vm_eflags,1 ret remove_dir_done: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 ret remove_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FIND_FIRST ; ; DESCRIPTION: DOS function 4E ; ; PARAMETERS: DS:DX PATHNAME ; CX ATTRIBUTE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; find_first PROC far push esi push edi push dx call get_prot_dta mov es,dx mov edi,ebx pop dx mov ds,[bp].pm_ds movzx esi,dx call find_first_file pop edi pop esi mov bx,[bp].vm_ebx jnc find_first_done mov ax,18 or byte ptr [bp].vm_eflags,1 ret find_first_done: mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 ret find_first ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RENAME_FILE ; ; DESCRIPTION: DOS function 56 ; ; PARAMETERS: DS:DX OLD FILENAME ; ES:DI NEW FILENAME ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rename_file PROC far push si mov ds,[bp].pm_ds mov si,dx RenameFile jc rename_file_fail and byte ptr [bp].vm_eflags,NOT 1 jmp rename_file_done rename_file_fail: or byte ptr [bp].vm_eflags,1 rename_file_done: pop si ret rename_file ENDP error_dos PROC far int 3 mov bx,[bp].vm_ebx or byte ptr [bp].vm_eflags,1 ret error_dos ENDP dos_tab: do00 DW OFFSET error_dos do01 DW OFFSET dos_read_key_echo do02 DW OFFSET dos_write_char do03 DW OFFSET error_dos do04 DW OFFSET error_dos do05 DW OFFSET error_dos do06 DW OFFSET dos_con_io do07 DW OFFSET dos_read_key do08 DW OFFSET dos_read_key do09 DW OFFSET display_string do0A DW OFFSET key_io do0B DW OFFSET dos_key_state do0C DW OFFSET dos_io_flush do0D DW OFFSET error_dos do0E DW OFFSET select_drive do0F DW OFFSET error_dos do10 DW OFFSET error_dos do11 DW OFFSET error_dos do12 DW OFFSET error_dos do13 DW OFFSET error_dos do14 DW OFFSET error_dos do15 DW OFFSET error_dos do16 DW OFFSET error_dos do17 DW OFFSET error_dos do18 DW OFFSET error_dos do19 DW OFFSET get_drive do1A DW OFFSET set_dta do1B DW OFFSET error_dos do1C DW OFFSET error_dos do1D DW OFFSET error_dos do1E DW OFFSET error_dos do1F DW OFFSET error_dos do20 DW OFFSET error_dos do21 DW OFFSET error_dos do22 DW OFFSET error_dos do23 DW OFFSET error_dos do24 DW OFFSET error_dos do25 DW OFFSET set_int do26 DW OFFSET error_dos do27 DW OFFSET error_dos do28 DW OFFSET error_dos do29 DW OFFSET parse_file do2A DW OFFSET get_system_date do2B DW OFFSET set_system_date do2C DW OFFSET get_system_time do2D DW OFFSET set_system_time do2E DW OFFSET error_dos do2F DW OFFSET get_dta do30 DW OFFSET dos_version do31 DW OFFSET error_dos do32 DW OFFSET error_dos do33 DW OFFSET control_c_check do34 DW OFFSET get_indos_flag do35 DW OFFSET get_int do36 DW OFFSET get_drive_allocation do37 DW OFFSET switch_char do38 DW OFFSET error_dos do39 DW OFFSET make_dir do3A DW OFFSET remove_dir do3B DW OFFSET set_cur_dir do3C DW OFFSET create_handle do3D DW OFFSET open_handle do3E DW OFFSET close_handle do3F DW OFFSET read_handle do40 DW OFFSET write_handle do41 DW OFFSET delete_file do42 DW OFFSET move_pointer do43 DW OFFSET file_attribute do44 DW OFFSET ioctl do45 DW OFFSET dupl_handle do46 DW OFFSET force_dupl_handle do47 DW OFFSET get_cur_dir do48 DW OFFSET allocate_mem do49 DW OFFSET error_dos do4A DW OFFSET resize_mem do4B DW OFFSET load_program do4C DW OFFSET end_program do4D DW OFFSET exit_code do4E DW OFFSET find_first do4F DW OFFSET find_next do50 DW OFFSET set_psp do51 DW OFFSET get_psp do52 DW OFFSET error_dos do53 DW OFFSET error_dos do54 DW OFFSET error_dos do55 DW OFFSET error_dos do56 DW OFFSET rename_file do57 DW OFFSET date_time_handle do58 DW OFFSET strategy do59 DW OFFSET error_dos do5A DW OFFSET error_dos do5B DW OFFSET error_dos do5C DW OFFSET error_dos do5D DW OFFSET dos5d do5E DW OFFSET error_dos do5F DW OFFSET error_dos do60 DW OFFSET error_dos do61 DW OFFSET error_dos do62 DW OFFSET get_psp do63 DW OFFSET error_dos do64 DW OFFSET error_dos do65 DW OFFSET error_dos do66 DW OFFSET error_dos do67 DW OFFSET error_dos do68 DW OFFSET error_dos do69 DW OFFSET error_dos do6A DW OFFSET error_dos do6B DW OFFSET error_dos do6C DW OFFSET error_dos do6D DW OFFSET error_dos do6E DW OFFSET error_dos do6F DW OFFSET error_dos doend DW OFFSET error_dos int21: mov bl,ah xor bh,bh add bx,bx cmp bx,0E0h jc dos_call_do mov bx,0E0h dos_call_do: push word ptr cs:[bx].dos_tab mov bx,[bp].vm_ebx mov ds,[bp].pm_ds retn PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ENTER_DOS16 ; ; DESCRIPTION: Enter 16-bit protected mode DOS ; ; PARAMETERS: ES PSP segment ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; enter_dos16_name DB 'Enter Dos16',0 enter_dos16 PROC far push ds push es push ax push bx push edx mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel call get_prot_psp or bx,bx jnz enter_psp_ok call get_virt_psp call set_virt_psp call get_prot_psp enter_psp_ok: mov es,bx movzx edx,word ptr es:psp_enviro shl edx,4 AllocateLdt mov word ptr [bx],0FFFFh mov [bx+2],edx mov byte ptr [bx+5],0F2h mov word ptr [bx+6],0 or bx,7 mov es:psp_enviro,bx pop edx pop bx pop ax pop es pop ds ret enter_dos16 ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT_DOS16 ; ; DESCRIPTION: Init module ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public init_dos16 init_dos16 PROC near mov ax,cs mov ds,ax mov es,ax mov al,21h mov di,OFFSET int21 HookProt16Int ; mov si,OFFSET enter_dos16 mov di,OFFSET enter_dos16_name xor cl,cl mov ax,enter_dos16_nr RegisterOsGate ret init_dos16 ENDP code ENDS END