push bp
mov bp, sp
- sub sp, 2
+ sub sp, 6
push bx
push cx
push di
push es
+ mov ax, cs:[_fat_sector]
+ mov word ptr [bp - 6], ax
+
+ mov ax, cs:[_fat_sector + 2]
+ mov word ptr [bp - 4], ax
+
mov ax, cs:[_fat_seg]
mov es, ax
_find_free12.error:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
stc
_find_free12.done:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
clc
push bp
mov bp, sp
- sub sp, 2
+ sub sp, 6
push bx
push cx
push di
push es
+ mov ax, cs:[_fat_sector]
+ mov word ptr [bp - 6], ax
+
+ mov ax, cs:[_fat_sector + 2]
+ mov word ptr [bp - 4], ax
+
mov ax, cs:[_fat_seg]
mov es, ax
_find_free16.error:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
stc
_find_free16.done:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
clc
push bp
mov bp, sp
- sub sp, 2
+ sub sp, 6
push bx
push cx
push di
push es
+ mov ax, cs:[_fat_sector]
+ mov word ptr [bp - 6], ax
+
+ mov ax, cs:[_fat_sector + 2]
+ mov word ptr [bp - 4], ax
+
mov ax, cs:[_fat_seg]
mov es, ax
_find_free32.error:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
stc
_find_free32.done:
+ mov bx, word ptr [bp - 6]
+ mov cs:[_fat_sector], bx
+
+ mov bx, word ptr [bp - 4]
+ mov cs:[_fat_sector + 2], bx
+
pop es
pop di
pop si
pop cx
pop bx
- add sp, 2
+ add sp, 6
pop bp
clc
_nextcluster_fat12.compare:
+ xor dx, dx
+
cmp ax, HEX (0FF8)
cmc
_nextcluster_fat12.done:
- xor dx, dx
-
pop si
pop cx
ret
_nextcluster_fat16.compare:
+ xor dx, dx
+
cmp ax, HEX (FFF8)
cmc
_nextcluster_fat16.done:
- xor dx, dx
-
pop si
pop cx
ret
% define HEX(y) 0x##y
%endif
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Include our fat.inc.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+%include "fat.inc"
+
;******************************************************************************
; @function _read_cluster
;******************************************************************************
_seek_file.done:
- mov word ptr es:[si + 52], 1
+ mov word ptr es:[si + 54], 1
mov ax, es:[si + 62]
mov dx, es:[si + 64]
ret
+;******************************************************************************
+; @function _write_file
+;******************************************************************************
+global _write_file
+_write_file:
+
+ push bp
+
+ mov bp, sp
+ sub sp, 12
+
+ push bx
+ push cx
+ push dx
+ push si
+ push di
+ push es
+ push ds
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Make sure our total bytes read is zero.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov word ptr [bp - 2], 0
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Make sure we're not write-only.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ cmp word ptr es:[si + 56], 0
+ je _write_file.error
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; If theres zero byte to write then truncate/extend.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ and cx, cx
+ jz _write_file.zero
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; For now we'll jump to error
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ jmp _write_file.error
+
+_write_file.zero:
+
+ mov ax, es:[si + 66]
+ mov dx, es:[si + 68]
+
+ cmp dx, es:[si + 64]
+ ja _write_file.truncate
+
+ cmp dx, es:[si + 64]
+ jne _write_file.extend
+
+ cmp ax, es:[si + 62]
+ jb _write_file.extend
+
+_write_file.truncate:
+
+ mov bx, es:[si + 58]
+ or bx, es:[si + 60]
+
+ and bx, bx
+ jz _write_file.done
+
+ mov cx, es:[si + 50]
+ div cx
+
+ mov bx, ax
+
+ mov ax, es:[si + 62]
+ mov dx, es:[si + 64]
+
+ mov cx, es:[si + 50]
+ div cx
+
+ mov cx, ax
+ xchg bx, cx
+
+ mov ax, es:[si + 58]
+ mov dx, es:[si + 60]
+
+_write_file.truncate_walk:
+
+ mov word ptr [bp - 6], ax
+ mov word ptr [bp - 4], dx
+
+ and bx, bx
+ jz _write_file.truncate_ok
+
+ call cs:[_next_cluster]
+ jc _write_file.truncate_ok
+
+ dec cx
+
+ dec bx
+ jnz _write_file.truncate_walk
+
+_write_file.truncate_ok:
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ mov word ptr [bp - 12], cx
+
+_write_file.truncate_loop:
+
+ and cx, cx
+ jz _write_file.truncate_done
+
+ call cs:[_next_cluster]
+ jc _write_file.truncate_done
+
+ push si
+ push di
+
+ mov si, ax
+ mov di, dx
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ mov word ptr [bp - 6], si
+ mov word ptr [bp - 4], di
+
+ pop di
+ pop si
+
+ push bx
+ push cx
+
+ xor bx, bx
+ xor cx, cx
+
+ call cs:[_update_cluster]
+
+ pop cx
+ pop bx
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ dec cx
+ jnz _write_file.truncate_loop
+
+_write_file.truncate_done:
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ push bx
+ push cx
+
+ xor bx, bx
+ xor cx, cx
+
+ call cs:[_update_cluster]
+
+ pop cx
+ pop bx
+
+ xor ax, ax
+ xor dx, dx
+
+ mov bx, es:[si + 62]
+ or bx, es:[si + 64]
+
+ and bx, bx
+ jz _write_file.truncate_update
+
+ mov ax, es:[si + 58]
+ mov dx, es:[si + 60]
+
+ push bx
+ push cx
+
+ mov bx, HEX (FFFF)
+ mov cx, HEX (FFF8)
+
+ call cs:[_update_cluster]
+
+ pop cx
+ pop bx
+
+ dec word ptr [bp - 12]
+
+_write_file.truncate_update:
+
+ mov es:[si + 58], ax
+ mov es:[si + 60], dx
+
+ mov ax, es:[si + 58]
+ mov word ptr [bp - 6], ax
+
+ mov ax, es:[si + 60]
+ mov word ptr [bp - 4], ax
+
+ mov ax, es:[si + 62]
+ mov dx, es:[si + 64]
+
+ mov es:[si + 66], ax
+ mov word ptr [bp - 10], ax
+
+ mov es:[si + 68], dx
+ mov word ptr [bp - 8], dx
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Update the entry on disk.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, es:[si + 74]
+ mov dx, es:[si + 76]
+
+ mov cx, es:[si + 78]
+ mov di, es:[si + 80]
+
+ push es
+ push bx
+ push ax
+ push dx
+ push cx
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+
+ xor bx, bx
+ call _read_sectors
+
+ mov ax, word ptr [bp - 6]
+ mov es:[di + 26], ax
+
+ mov ax, word ptr [bp - 4]
+ mov es:[di + 20], ax
+
+ mov ax, word ptr [bp - 10]
+ mov es:[di + 28], ax
+
+ mov ax, word ptr [bp - 8]
+ mov es:[di + 30], ax
+
+ pop cx
+ pop dx
+ pop ax
+
+ xor bx, bx
+ call _write_sectors
+
+ pop bx
+ pop es
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Check if we have an info sector.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, cs:[_info_sector]
+
+ and ax, ax
+ jz _write_file.done
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Update the free clusters.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ xor dx, dx
+
+ add ax, cs:[_hidden_sectors]
+ adc dx, cs:[_hidden_sectors + 2]
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+ xor bx, bx
+
+ mov cx, 1
+ call _read_sectors
+
+ mov di, HEX (01E0)
+
+ mov ax, es:[di + 8]
+ mov dx, es:[di + 10]
+
+ add ax, word ptr [bp - 12]
+ adc dx, 0
+
+ mov es:[di + 8], ax
+ mov es:[di + 10], dx
+
+ mov ax, cs:[_info_sector]
+ xor dx, dx
+
+ add ax, cs:[_hidden_sectors]
+ adc dx, cs:[_hidden_sectors + 2]
+
+ mov cx, 1
+ call _write_sectors
+
+ jmp _write_file.done
+
+_write_file.extend:
+
+ push es
+ push di
+ push ax
+
+ xor cx, es:[si + 50]
+
+ mov ax, cs:[_disk_scratch]
+ mov es, ax
+ xor di, di
+
+ xor al, al
+ rep stosb
+
+ pop ax
+ pop di
+ pop es
+
+ mov cx, es:[si + 50]
+ div cx
+
+ mov bx, ax
+
+ mov ax, es:[si + 62]
+ mov dx, es:[si + 64]
+
+ mov cx, es:[si + 50]
+ div cx
+
+ mov cx, ax
+
+ mov ax, es:[si + 58]
+ mov dx, es:[si + 60]
+
+ mov di, ax
+ or di, dx
+
+ and di, di
+ jnz _write_file.extend_walk
+
+ call cs:[_find_free]
+ jc _write_file.done
+
+ mov word ptr [bp - 6], ax
+ mov word ptr [bp - 4], dx
+
+ mov es:[si + 58], ax
+ mov es:[si + 60], dx
+
+ push bx
+ push cx
+ call cs:[_convert_cluster]
+
+ pop cx
+ pop bx
+ jc _write_file.done
+
+ push es
+ push bx
+ push cx
+
+ xor ch, ch
+ mov cl, cs:[_sectors_per_cluster]
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+
+ xor bx, bx
+ call _write_sectors
+
+ pop cx
+ pop bx
+ pop es
+
+ jmp _write_file.extend_no_walk
+
+_write_file.extend_walk:
+
+ mov word ptr [bp - 6], ax
+ mov word ptr [bp - 4], dx
+
+ and bx, bx
+ jz _write_file.extend_no_walk
+
+ call cs:[_next_cluster]
+ jc _write_file.extend_no_walk
+
+ dec cx
+
+ dec bx
+ jnz _write_file.extend_walk
+
+_write_file.extend_no_walk:
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ mov word ptr [bp - 12], cx
+
+_write_file.extend_loop:
+
+ and cx, cx
+ jz _write_file.extend_update
+
+ call cs:[_find_free]
+ jc _write_file.done
+
+ push bx
+ push cx
+
+ mov bx, dx
+ mov cx, ax
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ call cs:[_update_cluster]
+
+ push bx
+ push cx
+ call cs:[_convert_cluster]
+
+ pop cx
+ pop bx
+ jc _write_file.extend_update
+
+ push es
+ push bx
+ push cx
+
+ xor ch, ch
+ mov cl, cs:[_sectors_per_cluster]
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+
+ xor bx, bx
+ call _write_sectors
+
+ pop cx
+ pop bx
+ pop es
+
+ mov word ptr [bp - 6], cx
+ mov word ptr [bp - 4], bx
+
+ pop cx
+ pop bx
+
+ dec cx
+ jnz _write_file.extend_loop
+
+_write_file.extend_update:
+
+ push es
+ push bx
+ push cx
+
+ mov bx, HEX (FFFF)
+ mov cx, HEX (FFF8)
+
+ mov ax, word ptr [bp - 6]
+ mov dx, word ptr [bp - 4]
+
+ call cs:[_update_cluster]
+
+ call cs:[_convert_cluster]
+ jc _write_file.done
+
+ xor ch, ch
+ mov cl, cs:[_sectors_per_cluster]
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+
+ xor bx, bx
+ call _write_sectors
+
+ pop cx
+ pop bx
+ pop es
+
+ mov ax, es:[si + 58]
+ mov word ptr [bp - 6], ax
+
+ mov ax, es:[si + 60]
+ mov word ptr [bp - 4], ax
+
+ mov ax, es:[si + 62]
+ mov dx, es:[si + 64]
+
+ mov es:[si + 66], ax
+ mov word ptr [bp - 10], ax
+
+ mov es:[si + 68], dx
+ mov word ptr [bp - 8], dx
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Update the entry on disk.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, es:[si + 74]
+ mov dx, es:[si + 76]
+
+ mov cx, es:[si + 78]
+ mov di, es:[si + 80]
+
+ push es
+ push bx
+ push ax
+ push dx
+ push cx
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+
+ xor bx, bx
+ call _read_sectors
+
+ mov ax, word ptr [bp - 6]
+ mov es:[di + 26], ax
+
+ mov ax, word ptr [bp - 4]
+ mov es:[di + 20], ax
+
+ mov ax, word ptr [bp - 10]
+ mov es:[di + 28], ax
+
+ mov ax, word ptr [bp - 8]
+ mov es:[di + 30], ax
+
+ pop cx
+ pop dx
+ pop ax
+
+ xor bx, bx
+ call _write_sectors
+
+ pop bx
+ pop es
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Check if we have an info sector.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, cs:[_info_sector]
+
+ and ax, ax
+ jz _write_file.done
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Update the free clusters.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ xor dx, dx
+
+ add ax, cs:[_hidden_sectors]
+ adc dx, cs:[_hidden_sectors + 2]
+
+ mov bx, cs:[_disk_scratch]
+ mov es, bx
+ xor bx, bx
+
+ mov cx, 1
+ call _read_sectors
+
+ mov di, HEX (01E0)
+
+ mov ax, es:[di + 8]
+ mov dx, es:[di + 10]
+
+ sub ax, word ptr [bp - 12]
+ sbb dx, 0
+
+ mov es:[di + 8], ax
+ mov es:[di + 10], dx
+
+ mov ax, cs:[_info_sector]
+ xor dx, dx
+
+ add ax, cs:[_hidden_sectors]
+ adc dx, cs:[_hidden_sectors + 2]
+
+ mov cx, 1
+ call _write_sectors
+
+_write_file.done:
+
+ mov word ptr es:[si + 54], 1
+
+ pop ds
+ pop es
+ pop di
+ pop si
+ pop dx
+ pop cx
+ pop bx
+
+ add sp, 12
+ clc
+
+ mov ax, word ptr [bp - 2]
+ pop bp
+
+ ret
+
+_write_file.error:
+
+ mov word ptr es:[si + 54], 1
+
+ pop ds
+ pop es
+ pop di
+ pop si
+ pop dx
+ pop cx
+ pop bx
+
+ add sp, 12
+ stc
+
+ mov ax, 5
+ pop bp
+
+ ret
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Data area.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_get_disk_info.done:
- xor ax, ax
-
- mov cs:[_fat_sector], ax
- mov cs:[_fat_sector + 2], ax
+ mov word ptr cs:[_fat_sector], 0
+ mov word ptr cs:[_fat_sector + 2], 0
pop ds
pop es
inc cx
mov ax, si
- mov dx, si
+ mov dx, di
jmp _int21_3A.clear
mov ax, cs:[_info_sector]
and ax, ax
- jz _int21_41.done
+ jz _int21_3A.done
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Update the free clusters.
_int21_3B.get_path:
+ mov word ptr cs:[_fat_sector], 0
+ mov word ptr cs:[_fat_sector + 2], 0
+
mov di, si
push es
_int21_3C.open:
+ mov ax, HEX (3D02)
+
call _open_file
jnc _int21_3C.zero
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Try and open the file again.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, HEX (3D02)
+
call _open_file
jc _int21_3C.error
_int21_3F.read:
+ mov word ptr cs:[_fat_sector], 0
+ mov word ptr cs:[_fat_sector + 2], 0
+
pop cx
pop ax
pop ds
;; If stdin was passed then we can't write to it.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
and bx, bx
- jz _int21_40.error
+ jz _int21_40.invalid
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Otherwise, lets write the bytes.
;; Check if we have any open files.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp word ptr cs:[_vec_files + 2], 0
- je _int21_40.error
+ je _int21_40.invalid
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Make sure we have a valid file handle.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp bx, 3
- jb _int21_40.error
+ jb _int21_40.invalid
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Get the correct file offset by subtracting 3.
;; If the vector entry is zero then the file handle is invalid.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp word ptr es:[bx], 0
- je _int21_40.error
+ je _int21_40.invalid
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Re-initialize the extra segment but this time with the address
push ax
push cx
- mov ds, ax
xor si, si
+ mov ds, ax
lodsw
mov cs:[_curr_cluster], ax
_int21_40.write:
+ mov word ptr cs:[_fat_sector], 0
+ mov word ptr cs:[_fat_sector + 2], 0
+
pop cx
pop ax
pop ds
pop si
mov es, ax
+ xor si, si
+
+ call _write_file
+ jc _int21_40.error
+
+ jmp _int21_40.done
+
+_int21_40.invalid:
+
+ mov ax, 6
+ stc
_int21_40.error:
pop bx
pop bp
- mov ax, 6
- stc
-
jmp iretc
_int21_40.done:
_int21_4F.find:
+ mov word ptr cs:[_fat_sector], 0
+ mov word ptr cs:[_fat_sector + 2], 0
+
pop bx
pop cx