;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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 ; ; RAMDRIVE.ASM ; Preloadable in-system drive (z:) support. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME ramdrive GateSize = 16 INCLUDE driver.def INCLUDE protseg.def INCLUDE user.def INCLUDE virt.def INCLUDE os.def INCLUDE user.inc INCLUDE virt.inc INCLUDE os.inc INCLUDE system.def INCLUDE system.inc INCLUDE fs.inc MAX_RAM_DRIVES EQU 4 dev_name EQU 8 dev_param EQU 90h dev_next EQU 0E0h dev_type EQU 0E4h dev_ip EQU 0FAh file_header STRUC head_base DB 8 DUP(?) head_ext DB 3 DUP(?) head_attrib DB ? head_resv DB 10 DUP(?) head_time DW ? head_date DW ? head_cluster DW ? head_size DD ? head_data DB ? file_header ENDS rde_struc STRUC rde_base dir_dir_entry_data_struc <> rde_ptr DD ? rde_data DD ? rde_name DB ? rde_struc ENDS rfe_struc STRUC rfe_base dir_file_entry_data_struc <> rfe_ptr DD ? rfe_data DD ? rfe_name DB ? rfe_struc ENDS fs_data_seg STRUC drive_count DW ? drive_arr DW 26 DUP(?) drive_sel_arr DW MAX_RAM_DRIVES DUP(?) fs_data_seg ENDS drive_data_seg STRUC drive_list_ptr DD ? drive_root_ptr DD ? drive_free_ptr DD ? drive_nr DB ? drive_data_seg ENDS .386p code SEGMENT byte public use16 'CODE' assume cs:code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: MOUNT ; ; DESCRIPTION: Mount filesystem on drive ; ; RETRUNS: DS:SI ADDRESS TO DRIVE DATA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mount PROC far push es push bx push eax mov eax,SIZE drive_data_seg AllocateSmallGlobalMem mov ax,es mov ds,ax mov ax,ramdrive_data_sel mov es,ax pop eax mov ds:drive_list_ptr,0 mov ds:drive_free_ptr,0 movzx si,al shl si,1 mov ds:drive_nr,al mov bx,es:drive_count mov es:[si].drive_arr,bx mov si,bx shl si,1 mov es:[si].drive_sel_arr,ds inc bx mov es:drive_count,bx ; pop bx pop es ret mount ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FLUSH ; ; DESCRIPTION: Flush filesystem ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; flush PROC far stc ret flush ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DISMOUNT ; ; DESCRIPTION: Unmount filesystem ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dismount PROC far ret dismount ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DRIVE_INFO ; ; DESCRIPTION: Get drive info ; ; RETURNS: EAX FREE UNITS ; CX BYTES / UNIT ; EDX TOTAL UNITS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_drive_info PROC far AvailableBigLinear mov edx,eax GetFreePhysical shr edx,12 shr eax,12 mov cx,1000h clc ret get_drive_info ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CREATE_DIR ; ; DESCRIPTION: Create new directory ; ; PARAMETERS: ES:EDI DIRECTORY NAME ; NC SUCCESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; create_dir PROC far push es push fs push gs push eax push bx push ecx push edi push ebp ; mov ax,es mov gs,ax mov ebp,edi mov fs,bx ; call get_file_name_size mov ax,flat_sel mov es,ax mov eax,SIZE rde_struc add eax,ecx AllocateSmallLinear mov edi,edx add edx,OFFSET rde_name mov es:[edi].de_name,edx mov es:[edi].de_name_size,cx mov al,ds:drive_nr mov es:[edi].de_drive,al mov es:[edi].de_usage,0 mov es:[edi].de_attrib,10h ; push esi push edi mov esi,ebp mov edi,edx rep movs byte ptr es:[edi],gs:[esi] xor al,al stos byte ptr es:[edi] pop edi pop esi ; GetTime mov es:[edi].de_time,eax mov es:[edi+4].de_time,edx ; mov bx,fs mov edx,edi InsertDirEntry clc ; pop ebp pop edi pop ecx pop bx pop eax pop gs pop fs pop es ret create_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DELETE_DIR ; ; DESCRIPTION: Delete empty directory ; ; PARAMETERS: BX DIR SELECTOR ; EDX DIR ENTRY TO DELETE ; NC SUCCESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; delete_dir PROC far push ecx xor ecx,ecx FreeLinear pop ecx clc ret delete_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DELETE_FILE ; ; DESCRIPTION: Delete file ; ; PARAMETERS: BX DIR SELECTOR ; EDX FILE ENTRY TO DELETE ; NC SUCCESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; delete_file PROC far push ecx xor ecx,ecx FreeLinear pop ecx clc ret delete_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RENAME_FILE ; ; DESCRIPTION: rename file within filesystem ; ; PARAMETERS: FS:ESI CURRENT NAME ; ES:EDI NEW NAME ; NC SUCCESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rename_file PROC far int 3 stc ret rename_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_file_name_size ; ; DESCRIPTION: Get file name size ; ; PARAMETERS: ES:EDI Filename ; ; RETURNS: ECX File name size ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_file_name_size Proc near push ax push edi ; xor ecx,ecx get_name_size_loop: mov al,es:[edi] inc ecx inc edi or al,al jnz get_name_size_loop ; dec ecx pop edi pop ax ret get_file_name_size Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CREATE_FILE ; ; DESCRIPTION: Create file ; ; PARAMETERS: ES:EDI Filename ; BX Dir ; CX Attribute ; ; RETURNS: EDX Dir entry ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; create_file PROC far push es push fs push gs push eax push bx push edi push ebp ; mov ax,es mov gs,ax mov ebp,edi mov fs,bx ; push ecx call get_file_name_size mov ax,flat_sel mov es,ax mov eax,SIZE rfe_struc add eax,ecx AllocateSmallLinear mov edi,edx add edx,OFFSET rfe_name mov es:[edi].de_name,edx mov es:[edi].de_name_size,cx mov al,ds:drive_nr mov es:[edi].de_drive,al mov es:[edi].de_usage,0 ; push esi push edi mov esi,ebp mov edi,edx rep movs byte ptr es:[edi],gs:[esi] xor al,al stos byte ptr es:[edi] pop edi pop esi ; pop ecx mov es:[edi].de_attrib,cl ; GetTime mov es:[edi].de_time,eax mov es:[edi+4].de_time,edx mov es:[edi].dfe_file_sel,0 mov es:[edi].dfe_data_size,0 ; mov bx,fs mov edx,edi InsertFileEntry clc ; pop ebp pop edi pop bx pop eax pop gs pop fs pop es ret create_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_IOCTL_DATA ; ; DESCRIPTION: Get IOCTL data ; ; PARAMETERS: BX HANDLE ; ; RETURNS: DX IOCTL_DATA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_ioctl_data PROC far movzx dx,al or dx,40h ret get_ioctl_data ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_FILE_SIZE ; ; DESCRIPTION: Set file size ; ; PARAMETERS: BX HANDLE ; EDX FILE SIZE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_file_size PROC far push es push fs push edi ; mov di,flat_sel mov es,di mov fs,bx mov fs:file_size,edx mov edi,fs:file_dir_entry mov es:[edi].dfe_data_size,edx clc ; pop edi pop fs pop es ret set_file_size ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: update_dir ; ; DESCRIPTION: Update dir entry ; ; PARAMETERS: EDX Dir dir entry ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; update_dir PROC far clc ret update_dir ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: update_file ; ; DESCRIPTION: Update file entry ; ; PARAMETERS: EDX Dir file entry ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; update_file PROC far clc ret update_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: READ_FILE ; ; DESCRIPTION: Read file ; ; PARAMETERS: BX HANDLE TO DEVICE ; ES:EDI BUFFER ; ECX NUMBER OF BYTES TO READ ; EDX POSITION ; ; RETURNS: EAX NUMBER OF BYTES READ ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; read_file PROC far push ds push ecx push edx push esi push edi ; mov ds,bx mov esi,ds:file_dir_entry mov ax,flat_sel mov ds,ax mov eax,[esi].dfe_data_size mov esi,[esi].rfe_data sub eax,edx jc read_file_done ; or eax,eax jnz read_file_not_zero ; xor eax,eax clc jmp read_file_done read_file_not_zero: cmp eax,ecx jnc read_file_do mov ecx,eax read_file_do: add esi,edx mov eax,ecx shr ecx,2 rep movs dword ptr es:[edi],[esi] movzx ecx,al and cl,3 rep movs byte ptr es:[edi],[esi] clc read_file_done: pop edi pop esi pop edx pop ecx pop ds ret read_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WRITE_FILE ; ; DESCRIPTION: Write file ; ; PARAMETERS: BX HANDLE TO DEVICE ; ES:EDI BUFFER ; ECX NUMBER OF BYTES TO READ ; EDX POSITION ; ; RETURNS: EAX NUMBER OF BYTES WRITTEN ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_file PROC far stc ret write_file ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: allocate_file_list ; ; DESCRIPTION: Allocate file list ; ; RETURNS: EDI Linear address ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_file_list PROC far push eax push ecx push edx ; mov eax,SIZE file_list_struc AllocateSmallLinear mov edi,edx ; pop edx pop ecx pop eax clc ret allocate_file_list ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: free_file_list ; ; DESCRIPTION: Free file list ; ; PARAMETERS: EDI Linear address ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; free_file_list PROC far push ecx push edx ; mov edx,edi mov ecx,SIZE file_list_struc FreeLinear ; pop edx pop ecx clc ret free_file_list ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: READ_FILE_BLOCK ; ; DESCRIPTION: Read file block ; ; PARAMETERS: BX HANDLE TO DEVICE ; EDI LINEAR ADDRESS ; ECX NUMBER OF PAGES TO READ ; EDX POSITION ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; read_file_block PROC far clc ret read_file_block ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WRITE_FILE_BLOCK ; ; DESCRIPTION: Write file block ; ; PARAMETERS: BX HANDLE TO DEVICE ; EDI LINEAR ADDRESS ; ECX NUMBER OF PAGES TO READ ; EDX POSITION ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_file_block PROC far clc ret write_file_block ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_entry_name_size ; ; DESCRIPTION: Get dir entry name size ; ; PARAMETERS: ESI Entry data ; ; RETURNS: ECX Size of entry name ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_entry_name_size Proc near push dx push esi ; xor ecx,ecx xor dl,dl mov cx,8 get_name_base_loop: lods byte ptr es:[esi] cmp al,' ' je get_name_base_ok ; inc dl loop get_name_base_loop ; inc esi get_name_base_ok: dec esi add esi,ecx inc dl ; mov cx,3 get_name_ext_loop: lods byte ptr es:[esi] cmp al,' ' je get_name_ext_ok ; inc dl loop get_name_ext_loop get_name_ext_ok: movzx ecx,dl pop esi pop dx ret get_entry_name_size Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: copy_entry_name ; ; DESCRIPTION: Copy entry name ; ; PARAMETERS: ESI Entry data ; EDI Dir entry name ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; copy_entry_name Proc near push dx push esi push edi ; mov edi,es:[edi].de_name xor ecx,ecx xor dx,dx mov cx,8 copy_name_base_loop: lods byte ptr es:[esi] cmp al,' ' je copy_name_base_ok ; inc dx stos byte ptr es:[edi] loop copy_name_base_loop ; inc esi copy_name_base_ok: dec esi add esi,ecx mov al,'.' inc dx stos byte ptr es:[edi] ; mov cx,3 copy_name_ext_loop: lods byte ptr es:[esi] cmp al,' ' je copy_name_ext_ok ; inc dx stos byte ptr es:[edi] loop copy_name_ext_loop copy_name_ext_ok: mov al,es:[edi-1] cmp al,'.' jne copy_name_add_zero ; dec edi dec dx copy_name_add_zero: xor al,al stos byte ptr es:[edi] ; pop edi mov es:[edi].de_name_size,dx pop esi pop dx ret copy_entry_name Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_entry_time ; ; DESCRIPTION: Get entry time ; ; PARAMETERS: ESI Entry data ; ; RETURNS: EDX:EAX Time ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_entry_time Proc near push bx push cx ; mov dx,es:[esi].head_date mov ax,dx shr dx,9 add dx,1980 mov cx,ax shr cx,5 mov ch,cl and ch,0Fh mov cl,al and cl,1Fh mov bx,es:[esi].head_time mov ax,bx shr bx,11 mov bh,bl shr ax,5 and al,3Fh mov bl,al mov ax,es:[esi].head_time mov ah,al add ah,ah and ah,3Fh TimeToBinary ; pop cx pop bx ret get_entry_time Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CACHE_FILE_ENTRY ; ; DESCRIPTION: Cache file entry ; ; PARAMETERS: ES:EDX device header ; FS dir ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cache_file_entry Proc near pushad ; mov esi,edx add esi,SIZE rdos_header call get_entry_name_size mov eax,SIZE rfe_struc add eax,ecx AllocateSmallLinear mov edi,edx add edx,OFFSET rfe_name mov es:[edi].de_name,edx mov al,ds:drive_nr mov es:[edi].de_drive,al mov es:[edi].de_usage,0 mov al,es:[esi].head_attrib or al,80h mov es:[edi].de_attrib,al call copy_entry_name call get_entry_time mov es:[edi].de_time,eax mov es:[edi+4].de_time,edx mov es:[edi].dfe_file_sel,0 mov eax,es:[esi].head_size mov es:[edi].dfe_data_size,eax lea edx,[esi].head_data mov es:[edi].rfe_data,edx ; mov bx,fs mov edx,edi InsertFileEntry ; popad ret cache_file_entry Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: cache_adapter_files ; ; DESCRIPTION: cache all files in adapter ; ; PARAMETERS: EDX base address ; BX Cached dir selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cache_adapter_files Proc near push ax push bx push edx cache_adapter_files_loop: mov ax,es:[edx].typ cmp ax,RdosFile jne cache_adapter_skip ; call cache_file_entry jmp cache_adapter_files_next cache_adapter_skip: cmp ax,RdosEnd je cache_adapter_files_done cache_adapter_files_next: add edx,es:[edx].len jmp cache_adapter_files_loop cache_adapter_files_done: pop edx pop bx pop ax ret cache_adapter_files Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Cache_adapter ; ; DESCRIPTION: Cache adapter ; ; PARAMETERS: EDX Dir entry to cache or 0 ; BX Cached dir selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cache_adapter Proc near push es push fs push gs pushad ; mov ax,flat_sel mov es,ax mov fs,bx mov ax,system_data_sel mov gs,ax mov cx,gs:rom_modules mov bx,OFFSET rom_adapters mov esi,2 xor edi,edi cache_adapter_loop: mov edx,gs:[bx].adapter_base call cache_adapter_files add bx,SIZE adapter_typ loop cache_adapter_loop ; popad pop gs pop fs pop es ret cache_adapter Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Cache_dir ; ; DESCRIPTION: Cache dir ; ; PARAMETERS: EDX Dir entry to cache or 0 ; BX Cached dir selector ; ; RETURNS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cache_dir PROC far or edx,edx jnz cache_dir_subdir ; call cache_adapter jmp cache_dir_done cache_dir_subdir: cache_dir_done: ret cache_dir Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init ; ; DESCRIPTION: init device ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dummy Proc far stc ret dummy Endp fs_name DB 'MEMORY',0 fs_ctrl: fs00 DW OFFSET mount, ramdrive_code_sel fs01 DW OFFSET flush, ramdrive_code_sel fs02 DW OFFSET dismount, ramdrive_code_sel fs03 DW OFFSET get_drive_info, ramdrive_code_sel fs04 DW OFFSET cache_dir, ramdrive_code_sel fs05 DW OFFSET update_dir, ramdrive_code_sel fs06 DW OFFSET update_file, ramdrive_code_sel fs07 DW OFFSET create_dir, ramdrive_code_sel fs08 DW OFFSET delete_dir, ramdrive_code_sel fs09 DW OFFSET delete_file, ramdrive_code_sel fs10 DW OFFSET rename_file, ramdrive_code_sel fs11 DW OFFSET create_file, ramdrive_code_sel fs12 DW OFFSET get_ioctl_data, ramdrive_code_sel fs13 DW OFFSET set_file_size, ramdrive_code_sel fs14 DW OFFSET read_file, ramdrive_code_sel fs15 DW OFFSET write_file, ramdrive_code_sel fs16 DW OFFSET allocate_file_list,ramdrive_code_sel fs17 DW OFFSET free_file_list, ramdrive_code_sel fs18 DW OFFSET read_file_block, ramdrive_code_sel fs19 DW OFFSET write_file_block, ramdrive_code_sel init PROC far push ds push es push fs push gs pushad mov bx,ramdrive_code_sel InitDevice ; mov eax,SIZE fs_data_seg mov bx,ramdrive_data_sel AllocateFixedSystemMem ; mov cx,ax xor di,di xor al,al rep stosb ; mov ax,cs mov ds,ax mov es,ax ; mov si,OFFSET fs_name mov di,OFFSET fs_ctrl RegisterFileSystem ; AllocateDynamicDrive mov di,OFFSET fs_name InstallFileSystem StartFileSystem ; popad pop gs pop fs pop es pop ds ret init ENDP code ENDS END init