Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 4.1/bdos.a86
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

11350 lines
232 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

include equates.a86
include system.a86
if PCPM204E
DONTWRITE_PATCH EQU YES
ROD_ERROR_PATCH EQU YES
else
DONTWRITE_PATCH EQU NO
ROD_ERROR_PATCH EQU NO
endif
dseg
extrn rlr:word
extrn bdos_conowner:word
extrn date_days:word
extrn free_dirnames:word
extrn sysvar_144:byte
extrn lp_xios_entry:dword
extrn free_dirdata:word
extrn pq_filesystem:word
extrn pq_error:word
cseg
public bdos_init
public bdos_main
public cwd_for_drive
extrn bdos_callback:near
bdos_init: ; DATA XREF: dseg:001Ao
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_functions dw offset DRV_ALLRESET ; DATA XREF: bdos_main+2o bdos:25F7o
db 1
dw offset DRV_SET
db 1
dw offset F_OPEN
db 35h
dw offset F_CLOSE
db 35h
dw offset F_SFIRST
db 25h
dw offset F_SNEXT
db 21h
dw offset F_DELETE
db 35h
dw offset F_READ
db 17h
dw offset F_WRITE
db 17h
dw offset F_MAKE
db 25h
dw offset F_RENAME
db 15h
dw offset DRV_ALLOCVEC
db 1
dw offset DRV_SETRO
db 1
dw offset F_ATTRIB
db 5
dw offset DRV_DPB
db 1
dw offset F_READRAND
db 1Bh
dw offset F_WRITERAND
db 1Bh
dw offset F_SIZE
db 19h
dw offset F_RANDREC
db 9
dw offset DRV_RESET
db 1
dw offset F_nop
db 1
dw offset F_nop
db 1
dw offset F_WRITEZF
db 1Bh
dw offset F_nop
db 19h
dw offset F_nop
db 19h
dw offset DRV_SPACE
db 1
dw offset DRV_FLUSH
db 1
dw offset flush0 ; Function 98 entry point
db 1
dw offset F_TRUNCATE
db 9
dw offset DRV_SETLABEL
db 5
dw offset DRV_GETLABEL
db 1
dw offset F_TIMEDATE
db 5
dw offset F_WRITEXFCB
db 5
dw offset F_PASSWD
db 1
dw offset F_BDOS_74
db 15h
dw offset flush0 ; Function 98 entry point
db 1
dw offset F_BDOS_75
db 1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_interrupt: ; CODE XREF: copy$alv+16p delete11+21p
; ...
nop
iret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
bdos_main: ; DATA XREF: dseg:0018o
add si, cx
add si, offset bdos_functions
call bdos_switch
mov ax, bx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fs_altentry: ; CODE XREF: tst$relog+Dj
mov cl, fs_function
xor ch, ch
mov si, cx
shl si, 1
add si, cx
add si, offset bdos_functions
mov es, rlr
mov dx, fs_param_low
pushf
pop ax
cli
jmps bdos_main_alt
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
bdos_switch: ; CODE XREF: bdos_main+6p
inc es:proc_indisk
push cx
push dx
push si
mov bx, offset pq_filesystem
mov cx, 204h
call bdos_callback
pop si
pop dx
pop cx
mov fs_function, cl
pushf
pop ax
cli
mov F_old_ss, ss
mov F_old_sp, sp
bdos_main_alt: ; CODE XREF: bdos:2606j
mov bx, ds
mov ss, bx
mov sp, offset F_entry_sp
push ax
popf
mov ax, es:word ptr proc_drive
mov word ptr fs_fcbdrive, ax
mov ax, es:userDS
mov fs_param_ds, ax
mov ax, es:userES
mov f_ret_es, ax
push es
push si
mov ax, ds
mov bx, es
mov ds, bx
mov es, ax
mov si, offset proc_dma
mov di, offset userdma
mov cx, 18h
rep movsb
mov ds, ax
mov ax, userdma
mov cl, 4
shr ax, cl
add userdmaseg, ax
and userdma, 0Fh
mov cx, 14h
xor ax, ax
mov di, offset fcbdsk
rep stosb
mov fs_param_low, dx
mov linfo, dl
pop si
push si
mov ah, cs:2[si] ; Flags for this call
test ah, 4 ; Bit 2: 33-byte FCB present
jz no_33_fcb
call copy_fcb_33
jmps no_36_fcb
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
no_33_fcb: ; CODE XREF: bdos_switch+84j
test ah, 8
jz no_36_fcb ; Bit 3: 36-byte FCB present
call copy_fcb_36
call get_record_coun
no_36_fcb: ; CODE XREF: bdos_switch+89j
; bdos_switch+8Ej
pop si
cmp fs_sectorcount, 1
jz single_call
test cs:byte ptr 2[si], 2; Bit 1: Call once for each sector
; specified by BDOS sector count
jz single_call
call F_repeat_call
jmps post_multicall
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
single_call: ; CODE XREF: bdos_switch+9Cj
; bdos_switch+A3j
call F_do_call
post_multicall: ; CODE XREF: bdos_switch+A8j
mov cl, cur_fcb_len
xor ch, ch
jcxz fcb_len_0
mov si, offset user_fcb
mov di, fs_param_low
mov es, fs_param_ds
rep movsb
test fcb_is_for_dir, 0FFh
jz fcb_len_0
mov di, fs_param_low
or es:byte ptr [di], 80h
fcb_len_0: ; CODE XREF: bdos_switch+B3j
; bdos_switch+C7j
pop es
mov al, fs_function
cmp al, 4
jz f_to_proc
cmp al, 5
jz f_to_proc
cmp al, 21h
jnz f_switchout
f_to_proc: ; CODE XREF: bdos_switch+D7j
; bdos_switch+DBj
mov si, offset sys_fx
mov di, offset proc_fx
mov cx, 14h
rep movsb
f_switchout: ; CODE XREF: bdos_switch+DFj
mov ax, f_ret_es
mov es:userES, ax
mov bx, aret
pushf
pop ax
cli
mov ss, F_old_ss
mov sp, F_old_sp
push ax
popf
mov al, err_major
push bx
test al, 0FFh
jz fs_release
push fs_param_ds
mov bx, 0FFFFh
test set_if_attrs, 0FFh
jz fs_ret_error
mov bx, fs_param_low
fs_ret_error: ; CODE XREF: bdos_switch+118j
push bx
mov ah, error_drive
fs_release: ; CODE XREF: bdos_switch+10Aj
push ax
mov bx, offset pq_filesystem
mov cx, 205h
call bdos_callback
pop ax
test al, 0FFh
jnz f_abort
jmp f_noabort
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_abort: ; CODE XREF: bdos_switch+130j
push ax
mov bx, offset pq_error
mov cx, 204h
call bdos_callback
mov dx, addr_cpm_error
call f_printstring
pop ax
push ax
add ah, 'A'
mov byte ptr strColonSpace, ah
mov dx, offset strColonSpace
call f_printstring
pop ax
push ax
mov bl, al
xor bh, bh
shl bx, 1
mov bx, error_strings[bx]
mov dx, [bx]
call f_printstring
mov dx, addr_bdos_fn
call f_printstring
pop ax
mov al, es:proc_fx
mov ah, '0'
cmp al, 100
jb f_printdec
push ax
mov dl, '1'
call f_printchar
pop ax
sub al, 100
f_printdec: ; CODE XREF: bdos_switch+176j
; bdos_switch+187j
sub al, 0Ah
jb f_printfile
inc ah
jmps f_printdec
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_printfile: ; CODE XREF: bdos_switch+183j
push ax
mov dl, ah
call f_printchar
pop dx
add dl, ':'
call f_printchar
pop si
pop dx
inc si
jz f_filedone
mov di, offset errFilename
push ds
push es
push ds
pop es
mov ds, dx
mov cx, 8
print_filename: ; CODE XREF: bdos_switch+1ABj
lodsb
and al, 7Fh
stosb
loop print_filename
mov al, '.'
stosb
mov cl, 3
print_filetype: ; CODE XREF: bdos_switch+1B6j
lodsb
and al, 7Fh
stosb
loop print_filetype
pop es
pop ds
mov dx, addr_file
call f_printstring
mov dx, offset errFilename
call f_printstring
f_filedone: ; CODE XREF: bdos_switch+199j
mov bx, offset pq_error
mov cx, 205h
call bdos_callback
f_noabort: ; CODE XREF: bdos_switch+132j
pop bx
push bx
mov cx, 206h
call bdos_callback
pop bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_do_call: ; CODE XREF: bdos_switch+AAp
; F_repeat_call+17p
mov F_entry_sp, sp
test cs:byte ptr 2[si], 20h; Can affect dirs?
jz not_for_dir
test user_fcb, 80h
jz not_for_dir
and user_fcb, 1Fh
mov fcb_is_for_dir, 0FFh
not_for_dir: ; CODE XREF: F_do_call+9j F_do_call+10j
test cs:byte ptr 2[si], 10h
jz fs_notfilefcb
push si
call reselect
pop si
fs_notfilefcb: ; CODE XREF: F_do_call+21j
call cs:word ptr [si]
F_return: ; CODE XREF: sel$error+27j
cmp set_if_attrs, 0
jz dont_set_attrs
mov al, xfcb_rdonly
mov bx, offset user_fcb
or 7[bx], al
mov al, high$ext
cmp al, 60h
jnz set_F12
or byte ptr 8[bx], 80h
jmps dont_set_ifattr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
set_F12: ; CODE XREF: F_do_call+40j
or 12[bx], al
dont_set_ifattr: ; CODE XREF: F_do_call+46j
mov al, result_F0F
or 15[bx], al
mov al, fcbdsk
mov [bx], al
dont_set_attrs: ; CODE XREF: F_do_call+30j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_repeat_call: ; CODE XREF: bdos_switch+A5p
mov call_flags, si
mov ah, cs:2[si]
mov al, fs_sectorcount
frc_loop: ; CODE XREF: F_repeat_call+40j
mov last_sec_count, al
push ax
mov si, call_flags
mov dx, fs_param_low
call F_do_call
mov bl, byte ptr aret
or bl, bl
pop ax
jz frc_inc
cmp bl, 0FFh
jz frc_abandon
mov bh, fs_sectorcount
sub bh, al
jmps frc_okay
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
frc_inc: ; CODE XREF: F_repeat_call+21j
test ah, 8
jz frc_notinc
call inc_fcb_record
frc_notinc: ; CODE XREF: F_repeat_call+33j
add userdma, 80h
dec al
jnz frc_loop
xor bx, bx
frc_okay: ; CODE XREF: F_repeat_call+2Ej
mov aret, bx
frc_abandon: ; CODE XREF: F_repeat_call+26j
test ah, 8
jz frc_return
call fcb_recno_addr
jmps put_record_coun
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get_record_coun: ; CODE XREF: bdos_switch+93p
call fcb_recno_addr
xchg bx, dx
put_record_coun: ; CODE XREF: F_repeat_call+50j
mov cl, 3
jmp move ; Copy CL bytes from DX to BX
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fcb_recno_addr: ; CODE XREF: F_repeat_call+4Dp
; get_record_counp
mov bx, offset user_fcb+21h
mov dx, offset fcb_randrec_num
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy_fcb_33: ; CODE XREF: bdos_switch+86p
; bdos:462Ep
mov cl, 21h
jmps copy_fcb
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy_fcb_36: ; CODE XREF: bdos_switch+90p
mov cl, 24h
copy_fcb: ; CODE XREF: copy_fcb_33+2j
; F_PASSWD+2p
mov cur_fcb_len, cl
xor ch, ch
mov si, fs_param_low
mov di, offset user_fcb
push ds
mov ds, fs_param_ds
rep movsb
pop ds
frc_return: ; CODE XREF: F_repeat_call+4Bj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
inc_fcb_record: ; CODE XREF: F_repeat_call+35p
mov bx, offset user_fcb+21h
inc word ptr [bx]
jnz ifr_ret
inc byte ptr 2[bx]
ifr_ret: ; CODE XREF: inc_fcb_record+5j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_printchar: ; CODE XREF: bdos_switch+17Bp
; bdos_switch+18Cp ...
mov cx, 419h
jmp bdos_callback
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_printstring: ; CODE XREF: bdos_switch+143p
; bdos_switch+152p ...
mov bx, dx
f_prstr_loop: ; CODE XREF: f_printstring+Fj
mov dl, [bx]
cmp dl, '$'
jz f_prstr_end
push bx
call f_printchar
pop bx
inc bx
jmps f_prstr_loop
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_prstr_end: ; CODE XREF: f_printstring+7j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fs_call_xios: ; CODE XREF: drive_login+5p
; DRV_FLUSH+9p ...
push es
mov es, rlr
callf dword ptr lp_xios_entry
cld
pop es
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
xios_rdwr: ; CODE XREF: wrbuff+2p rdbuff+2p
; ...
mov dx, bcb_record
mov ch, bcb_record_h
mov bl, curdsk
mov bh, 1
xchg bh, fs_rdwrcount
push bx
push fs_track
push fs_sector
push word ptr fs_buffer
push word ptr fs_buffer+2
mov es, rlr
callf dword ptr lp_xios_entry
add sp, 0Ah
cld
push ds
pop es
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fs_abort1: ; CODE XREF: rdbuff+74j
mov ah, 1
jmps goerr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
rod$error:
call discard$dir ; Report read/only disk error
if ROD_ERROR_PATCH
jmp rod_err_patch
nop
else
mov ah, 2
jmps goerr
endif
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
rof$error: ; CODE XREF: check$rodir+8j
; fat_delete+34j ...
mov ah, 3
jmps goerr
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Report select error
sel$error: ; CODE XREF: cwd_for_drive+2Bj
mov curdsk, 0FFh ; Invalidate curdsk to force select
; call at next curselect call
mov ah, 4
goerr: ; CODE XREF: fs_abort1+2j rof$error+2j
; ...
mov al, 0FFh
mov aret, ax
cmp fs_errormode, al
jnz error
rtn$phy$errs: ; CODE XREF: error+Fj error+23j
mov al, fs_function
cmp al, 0Bh ; Return 0ffffh if function 27 or 31
jz fs_abort_ffff
cmp al, 0Eh
jnz goback
fs_abort_ffff: ; CODE XREF: sel$error+17j
mov aret, 0FFFFh
goback: ; CODE XREF: sel$error+1Bj
; disk_error+10j ...
mov sp, F_entry_sp
jmp F_return
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_ret_1: ; CODE XREF: open$reel+79j
; open$reel+97j ...
mov al, 1
sta$ret: ; CODE XREF: check_changed+11j
; tst$inv$fcb+8j ...
mov byte ptr aret, al
F_nop: ; DATA XREF: bdos:25AAo bdos:25ADo
; ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
disk_error: ; CODE XREF: valid_dl_f_fcb+Aj
; cpm_writerec+17j ...
mov al, 0FFh
mov aret, ax
cmp ah, 3 ; Error 3 -> Error 12
jnz diskerr_not3
mov ah, 0Ch
diskerr_not3: ; CODE XREF: disk_error+8j
cmp fs_errormode, al
jz goback
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
error: ; CODE XREF: sel$error+10j
mov err_major, ah
mov al, fs_fcbdrive
mov error_drive, al
cmp fs_errormode, 0FEh
jz rtn$phy$errs
push ds
mov ds, rlr
or proc_flags, 1
mov proc_errcode, 0FFFDh
pop ds
jmps rtn$phy$errs
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Copy CL bytes from DX to BX
move: ; CODE XREF: get_record_coun+7j
; deblock+100p ...
xor ch, ch
mov si, dx
mov di, bx
rep movsb
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compare CL bytes at DX and BX
compare: ; CODE XREF: discard$data+Cp
; get$bcba+5Bp ...
xor ch, ch
mov si, bx
mov di, dx
rep cmpsb
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
seek: ; CODE XREF: bdos:2C5Dp deblock$io+1p
; ...
mov ax, bcb_record
xor dx, dx
mov dl, bcb_record_h
mov cl, dpb_psh
xor ch, ch
jcxz lookup_p128
lookup_shift: ; CODE XREF: seek+15j
shr dx, 1
rcr ax, 1
loop lookup_shift
lookup_p128: ; CODE XREF: seek+Fj
cmp F_isfatfs, 0
jz lookup_cpm
add ax, dpb_firstfat
adc dx, 0
xchg ax, bx
mov al, byte ptr dpb_fatcount
mul byte ptr dpb_secperfat
add ax, bx
adc dx, 0
div dpb_spt
jmps lookup_haveoffs
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
lookup_cpm: ; CODE XREF: seek+1Cj
div dpb_spt
add ax, dpb_off
lookup_haveoffs: ; CODE XREF: seek+36j
mov fs_track, ax
mov fs_sector, dx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
atran: ; CODE XREF: bdos:3D15p cpm_writerec+96p
mov cl, dpb_bsh
mov ax, bcb_record
mov arecord1, ax
xor bh, bh
mov bl, ah
shl ax, cl
shl bx, cl
mov bcb_dirty, ax
xchg ax, bx
mov al, vrecord
and al, dpb_blm
mov blk$off, al
or bl, al
mov bcb_record, bx
mov bcb_record_h, ah
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
dm$position: ; CODE XREF: indexp check$nprs+77p
; ...
mov cl, dpb_bsh
mov ch, vrecord
shr ch, cl
neg cl
add cl, 7
mov al, extval
shl al, cl
add al, ch
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Get block CX from FCB; returns in BX
get$dm: ; CODE XREF: index+Ap check$nprs+8Ap
; ...
mov bx, offset user_fcb+10h
add bx, cx
cmp single, 0 ; Nonzero if using 8-bit blocks
jz bffcb_16bit
mov bl, [bx]
xor bh, bh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bffcb_16bit: ; CODE XREF: get$dm+Aj
add bx, cx
mov bx, [bx]
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compute disk block number from current FCB
index: ; CODE XREF: bdos:3D10p cpm_writerec+42p
call dm$position
mov dminx, al
mov cl, al
xor ch, ch
call get$dm ; Get block CX from FCB; returns in BX
mov bcb_record, bx
or bx, bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$atts: ; CODE XREF: cpm_deletep F_MAKE+31p
; ...
mov di, offset user_fcb+8
mov cx, 4
xor dl, dl
std
get_attrs0: ; CODE XREF: get$atts+12j
mov al, [di]
shl al, 1
rcr dl, 1
shr al, 1
stosb
loop get_attrs0
cld
mov al, dl
mov attributes, al ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compute directory extent from FCB
get$dir$ext: ; CODE XREF: getfcb+Dp open$copy+16p
; ...
mov bx, offset user_fcb+20h
mov dx, 1001h ; Scan FCB disk map backwards
get$de0: ; CODE XREF: get$dir$ext+10j
; get$dir$ext+31j
dec dh
dec bx
cmp byte ptr [bx], 0
jnz get$de2 ; fcb(dskmap(bx)) ~= 0
or dh, dh
jnz get$de0
dec dl ; DL=0 if all blocks are 0 in fcb
; disk map
get$de2: ; CODE XREF: get$dir$ext+Cj
mov dminx, dl
cmp single, 0FFh ; Nonzero if using 8-bit blocks
mov al, dh
jz get$de3
shr al, 1 ; not single, divide blk idx by 2
;
; Compute ext offset from last non-zero block index
; by shifting blk idx right by (7 - block shift)
;
get$de3: ; CODE XREF: get$dir$ext+1Fj
mov cl, 7
sub cl, dpb_bsh
shr al, cl
mov ah, dpb_exm
cmp ah, al ; Verify computed extent <= ext mask
jb get$de0
mov bx, offset user_fcb+0Ch
mov cl, [bx] ; Extent
not ah
and ah, 1Fh ; dir ext = (fcb ext & (~extmsk) & maxext) | ext offset
and ah, cl
or al, ah ; AL = directory extent
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compare extent nos in AL and CL
; Return nonzero if they do not match
compext: ; CODE XREF: bdos:3702p open$reel+Fp
; ...
push cx
mov ch, dpb_exm
not ch ; CH = mask for physical extent no#
and cl, ch
and al, ch
sub al, cl
and al, 1Fh ; Difference between 2 phys extents
pop cx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Set variables from currently addressed FCB
getfcb: ; CODE XREF: open$reel+58p
; bdos:3CF6p ...
mov al, user_fcb+20h
mov vrecord, al
cmp user_fcb+0Fh, 0
jnz getfcb0
call get$dir$ext ; Compute directory extent from FCB
mov cl, al
call set$rc
getfcb0: ; CODE XREF: getfcb+Bj
mov al, user_fcb+0Fh
cmp al, 81h
jb getfcb1
mov al, 80h
getfcb1: ; CODE XREF: getfcb+1Aj
mov rcount, al
mov al, dpb_exm
and al, user_fcb+0Ch
mov extval, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Place values back into current FCB
setfcb: ; CODE XREF: bdos:2F06j bdos:3D2Bj
; ...
xor al, al ; Don't change if random
cmp fs_function, 9 ; Is function < 9? (sequential read/write)
jnb setfcb1
inc al ; Increase current record
setfcb1: ; CODE XREF: setfcb+7j
add al, vrecord
mov user_fcb+20h, al
cmp user_fcb+0Fh, 80h; Don't reset RC if > 7Fh
jnb setfcb2
mov al, rcount
mov user_fcb+0Fh, al
setfcb2: ; CODE XREF: setfcb+17j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cksum_cl_bytes: ; CODE XREF: compute$cs+Ep
xor ch, ch
cksum8_loop: ; CODE XREF: cksum_cl_bytes+5j
add al, [bx]
inc bx
loop cksum8_loop
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compute checksum for current directory buffer
compute$cs: ; CODE XREF: r$dir+49p
mov bx, buffa
mov cx, 4
xor ah, ah ; AH=0,CX=4
compute$cs0: ; CODE XREF: compute$cs+14j
push cx
xor al, al
mov cl, 20h
call cksum_cl_bytes
xor ah, al
pop cx
loop compute$cs0
xchg al, ah ; Return with checksum in AL
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chek$fcb: ; CODE XREF: check_changedp
; F_CLOSE+2Cp
cmp high$ext, 60h
jnz chek$fcb1
xor al, al
mov user_fcb, al
chek$fcb1: ; CODE XREF: chek$fcb+5j
mov bx, lsn$add
mov al, user_fcb+0Dh
cmp 2[bx], al
d_notchanged: ; CODE XREF: check_changed+3j
; check_changed+Cj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check_changed: ; CODE XREF: F_READp F_WRITEp
; ...
call chek$fcb
jz d_notchanged
mov dx, removable_drive
call test$vector ; Return bit curdsk of vector DX
jz d_notchanged
pop bx
chk$media2: ; CODE XREF: chk$exit$fxs+Cj
mov al, 0Ah
jmp sta$ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$lsn: ; CODE XREF: open$reel+55p
; cpm_rwrand+ABp ...
mov bx, lsn$add
mov cl, 2[bx]
mov user_fcb+0Dh, cl
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$cdisk: ; CODE XREF: media$change+12p
; curselect+2Cp ...
mov cl, curdsk
set$cdisk1: ; CODE XREF: get$block+3Bp
mov ax, 1
shl ax, cl
or [bx], ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Return true if drive is software R/O
nowrite: ; CODE XREF: check$writep r$dir+63p
; ...
mov dx, readonly_vector
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Return bit curdsk of vector DX
test$vector: ; CODE XREF: check_changed+9p
; rdbuff+2Cp ...
mov cl, curdsk
shr dx, cl
and dx, 1
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
getdptra: ; CODE XREF: check$rodirp read$subdir+33p
; ...
mov bl, dptr
xor bh, bh
add bx, buffa
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cpm_getrdonly: ; CODE XREF: check$rodir+3p
add bx, 9
mov al, [bx]
rcl al, 1
can_write: ; CODE XREF: check$rodir+6j
; check$write+3j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$rodir: ; CODE XREF: cpm_delete+1Dp
; bdos:47E5p ...
call getdptra
check$rofile: ; CODE XREF: cpm_writerec+24p
; fat_rdwr+22p
call cpm_getrdonly
jnb can_write
jmp rof$error
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$write: ; CODE XREF: seek$copyp cpm_writerec+5p
; ...
call nowrite ; Return true if drive is software R/O
jz can_write
jmp rod$error ; Report read/only disk error
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
getmodnum: ; CODE XREF: setfwfp cpm_writerec+136p
mov bx, offset user_fcb+0Eh
mov al, [bx]
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Clear S2 byte of FCB
clrmodnum: ; CODE XREF: F_OPEN+3p F_SFIRST+30p
; ...
mov user_fcb+0Eh, 0
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
clr$ext: ; CODE XREF: reselect+24p F_SFIRST+2Dp
; ...
and user_fcb+0Ch, 1Fh
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
setfwf: ; CODE XREF: open$copyp close$fcb+9Bp
; ...
call getmodnum
or al, 80h
mov [bx], al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cp_fcb10_ffff: ; CODE XREF: tst$inv$fcbp close+11p
; ...
mov bx, offset user_fcb+10h
jmps cp_pbx_ffff
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
tst$inv$fcb: ; CODE XREF: bdos:3CEEp cpm_writerec+27p
call cp_fcb10_ffff
jnz eod_ret
pop bx
mov al, 9
jmp sta$ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
end$of$dir: ; CODE XREF: read$subdir+2Bp
; cpm_login+4Bp ...
mov bx, offset dcnt
cp_pbx_ffff: ; CODE XREF: cp_fcb10_ffff+3j
cmp word ptr [bx], 0FFFFh
eod_ret: ; CODE XREF: tst$inv$fcb+3j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$end$dir: ; CODE XREF: rd$subdir1+3Bj
; r$dir+11j ...
mov dcnt, 0FFFFh
mov dname_cluster, 0
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set_dcnt_dblk: ; CODE XREF: does$xfcb$exist+7p
; restore_dir_fcbp ...
mov ax, xdcnt
and al, 0FCh
dec ax
mov dcnt, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
compcdr: ; CODE XREF: setcdrp searchn+20p
; ...
mov dx, dcnt
mov bx, cdrmaxa
cmp dx, [bx]
tst$relog_ret: ; CODE XREF: setcdr+3j tst$log$fxs+5j
; ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
setcdr: ; CODE XREF: cpm_login+72p
; fat_login+4Cp ...
call compcdr
jb tst$relog_ret
inc dx
mov [bx], dx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
tst$log$fxs: ; CODE XREF: search$h_sub+23p
; reselect+46p
test byte ptr dpb_cks+1, 80h
jnz tst$relog_ret
mov di, offset log$fxs
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
tst$log0: ; CODE XREF: chk$exit$fxs+7p
; chk$exit$fxs+12p
mov cl, cs:[di]
inc di
xor ch, ch
mov al, fs_function
push cs
pop es
repne scasb
push ds
pop es
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chk$exit$fxs: ; CODE XREF: rdbuff+4Cp read$dir+Ap
; ...
mov bx, offset goback
push bx
mov di, offset rw$fxs; Read or write functions
call tst$log0
jnz chk_exit_fxs1
jmp chk$media2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
chk_exit_fxs1: ; CODE XREF: chk$exit$fxs+Aj
mov di, offset sc$fxs; Close or search functions
call tst$log0
jnz chk_exit_fxs2
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
chk_exit_fxs2: ; CODE XREF: chk$exit$fxs+15j
pop bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
tst$relog: ; CODE XREF: read$dir+Dp rd$parentdir+64j
xor al, al
xchg al, relog
test al, al
jz tst$relog_ret
call curselect
jmp fs_altentry
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
drv$relog: ; CODE XREF: check$media+3Ap
call curselect
xor ax, ax
mov dcnt, ax
mov dptr, al
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
recordok1: ; CODE XREF: fat_rdwr_ckd+16j
mov fs_rdwrcount, al
push cx
call setdata
call seek
pop cx
or cl, cl
jz wrbuff
jmps rdbuff
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
wrbuff: ; CODE XREF: bdos:2C63j deblock$io+Dj
; ...
mov al, 0Bh
call xios_rdwr
mov ah, 0FFh
jmps diocomp1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
rdbuff: ; CODE XREF: bdos:2C65j deblock$io+10p
; ...
mov al, 0Ah
call xios_rdwr
diocomp: ; CODE XREF: DRV_FLUSH+Cp call_xios_flush+5p
mov ah, 0
diocomp1: ; CODE XREF: wrbuff+7j write_FAT+3Fj
or al, al
jnz diocomp2
mov readf$sw, 0FFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
diocomp2: ; CODE XREF: rdbuff+9j
push ax
push bx
cmp al, 0FFh ; AL = 0FFh => media changed
jz diocomp_chg
mov al, bcb_drive
cmp al, fs_fcbdrive
jz diocomp_nochang
diocomp_chg: ; CODE XREF: rdbuff+15j
cmp dpb_cks, 8000h
jz diocomp_nochang
mov dx, login_vector
call test$vector ; Return bit curdsk of vector DX
jz diocomp_nochang
call media$change
cmp fs_function, 1Ah; Was this a flush operation?
jz wasflush
mov al, bcb_drive
cmp al, fs_fcbdrive
jz diocomp_notrelg ; To another drive?
mov relog, 0
wasflush: ; CODE XREF: rdbuff+39j
pop bx
pop ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
diocomp_notrelg: ; CODE XREF: rdbuff+42j
call chk$exit$fxs
test readf$sw, 0FFh ; Was this a directory read?
jz diocomp9
call lret$eq$ff
jmp goback
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
diocomp9: ; CODE XREF: rdbuff+54j
pop bx
pop ax
or ah, ah
jnz j_rod$error
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
diocomp_nochang: ; CODE XREF: rdbuff+1Ej rdbuff+26j
; ...
pop bx
pop ax
push es
mov es, rlr
mov es:byte ptr proc_countdown, bh
pop es
cmp al, 2
jz j_rod$error
jmp fs_abort1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_rod$error: ; CODE XREF: rdbuff+60j rdbuff+72j
jmp rod$error ; Report read/only disk error
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Release the BCB for bcb_drive, record bcb_record
discard$databcb: ; CODE XREF: cpm_writerec+C4p
; cpm_writerec+F8p ...
mov bx, dph_dtabcb
mov cl, 4
jmps bcb_rel_cl
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Release all directory BCBs for a drive
discard$dir: ; CODE XREF: bdos:291Dp cpm_login+19p
; ...
mov bx, dph_dirbcb
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Called with BX->BCB chain head. Release all BCBs for a drive
discard$data: ; CODE XREF: media$change+4p
; cpm_login+16p ...
mov cl, 1
bcb_rel_cl: ; CODE XREF: discard$databcb+6j
or bx, bx
jz no_bcb_chain
mov bx, [bx] ; BX -> first BCB
bcbrel_loop: ; CODE XREF: discard$data+1Aj
push cx
mov dx, offset bcb_drive
call compare ; Compare CL bytes at DX and BX
pop cx
jnz bcbrel_next
mov byte ptr [bx], 0FFh
bcbrel_next: ; CODE XREF: discard$data+10j
mov bx, 12[bx] ; Next BCB
or bx, bx
jnz bcbrel_loop
no_bcb_chain: ; CODE XREF: discard$data+4j
; proc$discard+2j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Free BCBs on bcb_drive used by current process
proc$discard: ; CODE XREF: DRV_FLUSH+6Fp
or bx, bx
jz no_bcb_chain
mov bx, [bx]
fpbcb_loop: ; CODE XREF: proc$discard+2Fj
mov al, [bx]
cmp al, bcb_drive
jnz fpbcb_next
mov ax, 14[bx] ; Owned by current process?
cmp ax, rlr
jnz fpbcb_next
mov word ptr 14[bx], 0
mov al, fs_function
cmp al, 1Ah ; Set DMA
jz fpbcb_freeit
cmp al, 15h ; F_WRITE
jnz fpbcb_next
fpbcb_freeit: ; CODE XREF: proc$discard+21j
mov byte ptr [bx], 0FFh
fpbcb_next: ; CODE XREF: proc$discard+Cj
; proc$discard+15j ...
mov bx, 12[bx]
or bx, bx
jnz fpbcb_loop
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$bcba: ; CODE XREF: deblock+90p
mov rootbcba, bx
mov di, bx
sub di, 0Ch
mov bx, [bx] ; BX->BCB. DI->prev BCB
cmp word ptr 12[bx], 0
jnz get$bcb05
jmp gcbca_end ; No BCB follows
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
get$bcb05: ; CODE XREF: get$bcba+Fj
xor ax, ax
mov emptybcba, ax
mov seqbcba, ax
mov my_bcbs, al ; BCBs owned by this process
get$bcb1: ; CODE XREF: get$bcba+CEj
cmp byte ptr [bx], 0FFh
jz got_free_bcb
mov ax, 14[bx]
or ax, ax
jnz has_owner
mov si, emptybcba
or si, si
jz got_free_bcb
mov si, 12[si]
cmp byte ptr [si], 0FFh
jz get$bcb14
got_free_bcb: ; CODE XREF: get$bcba+22j get$bcba+31j
mov emptybcba, di
mov byte ptr 5[bx], 0
jmps get$bcb14
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
has_owner: ; CODE XREF: get$bcba+29j
cmp ax, rlr
jnz get$bcb14
inc my_bcbs ; BCBs owned by this process
mov seqbcba, di
get$bcb14: ; CODE XREF: get$bcba+39j get$bcba+43j
; ...
mov curbcba, bx
push di
call set$arecord
call compare ; Compare CL bytes at DX and BX
pop di
mov bx, curbcba
jnz get$bcb17
mov al, 5[bx]
cmp al, 0FFh
jz get$bcb16
mov ah, phy$off
cmp al, ah
jz get$bcb16
inc al
cmp al, ah
jz get$bcb15
mov al, 0FFh
get$bcb15: ; CODE XREF: get$bcba+78j
mov 5[bx], al
get$bcb16: ; CODE XREF: get$bcba+6Aj get$bcba+72j
jmp get$bcb5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
get$bcb17: ; CODE XREF: get$bcba+63j
mov ax, 14[bx]
cmp ax, rlr
jnz get$bcb19
mov al, bcb_drive
cmp al, [bx]
jnz get$bcb19
mov al, dpb_phm
or al, al
jz get$bcb19
cmp al, 5[bx]
jnz get$bcb19
mov byte ptr 5[bx], 0
cmp word ptr 12[bx], 0
jz get$bcb21
dec my_bcbs ; BCBs owned by this process
xor ax, ax
xchg ax, 12[bx]
mov 12[di], ax
xchg ax, bx
get$bcb18: ; CODE XREF: get$bcba+BCj
mov si, bx
mov bx, 12[si]
or bx, bx
jnz get$bcb18
mov 12[si], ax
jmps get$bcb20
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
get$bcb19: ; CODE XREF: get$bcba+89j get$bcba+90j
; ...
cmp word ptr 12[bx], 0
jz get$bcb21
mov di, bx
get$bcb20: ; CODE XREF: get$bcba+C1j
mov bx, 12[di]
jmp get$bcb1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
get$bcb21: ; CODE XREF: get$bcba+A6j get$bcba+C7j
mov si, emptybcba
or si, si
jz get$bcb22
mov di, si
get$bcb22: ; CODE XREF: get$bcba+D7j
mov si, rootbcba
mov al, my_bcbs ; BCBs owned by this process
cmp al, 2[si]
jb get$bcb23
mov di, seqbcba
get$bcb23: ; CODE XREF: get$bcba+E5j
mov bx, 12[di]
mov al, phy$off
mov 5[bx], al
get$bcb5: ; CODE XREF: get$bcba+7Fj
mov si, rootbcba
mov ax, [si]
cmp ax, bx
jz gcbca_end
xchg ax, 12[bx]
mov 12[di], ax
mov [si], bx
gcbca_end: ; CODE XREF: get$bcba+11j get$bcba+FCj
mov ax, rlr
mov 14[bx], ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Take the last LRU buffer, move to head of chain,
; allocate to drive bcb_drive block DX
lru_touch: ; CODE XREF: cpm_writerec+71p
mov bx, offset p_lru_first
lru_goto_end: ; CODE XREF: lru_touch+Aj
mov di, bx ; DI->previous entry
mov bx, [bx]
cmp word ptr [bx], 0
jnz lru_goto_end
;
; BX->last entry in LRU chain
; DI->the one pointing to it
;
mov al, bcb_drive
mov 4[bx], al
mov 2[bx], dx
xor ax, ax
mov 5[bx], al
mov [di], ax ; Detach from chain
mov ax, bx
xchg ax, p_lru_first ; Move to head of chain
mov [bx], ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Free all LRU buffers for drive bcb_drive
lru_free: ; CODE XREF: copy$alv+1Fp cpm_writerec+FFp
mov al, bcb_drive
mov bx, offset p_lru_first
lru_free_loop: ; CODE XREF: lru_free+14j
mov bx, [bx]
cmp 4[bx], al
jnz lru_free_next
mov byte ptr 4[bx], 0FFh
lru_free_next: ; CODE XREF: lru_free+Bj
cmp word ptr [bx], 0
jnz lru_free_loop
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Returns Carry set if buffer dirty?
lru_ckdirty: ; CODE XREF: deblock+11Ep deblock+133p
; ...
test F_isfatfs, 0FFh
jz cpm_lrufind
cmp fat_buf_dirty?, 0FFh
cmc
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_lrufind: ; CODE XREF: lru_ckdirty+5j
mov al, bcb_drive
mov bx, offset p_lru_first
mov dx, arecord1
lrufind_loop: ; CODE XREF: lru_ckdirty+3Dj
mov bx, [bx]
cmp 4[bx], al ; Drive match?
jnz lrufind_next
cmp 2[bx], dx ; Record match?
jnz lrufind_next
cmp cl, 5[bx]
jb lrufind_end
mov al, dpb_phm
mov ah, al
not ah
and cl, ah
inc al
add al, cl
mov 5[bx], al
lrufind_end: ; CODE XREF: lru_ckdirty+27j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
lrufind_next: ; CODE XREF: lru_ckdirty+1Dj
; lru_ckdirty+22j
cmp word ptr [bx], 0
jnz lrufind_loop
stc
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Read/write a sector and/or update the current BCB with its address
; AL=0: Update BCB
; AL=1: Read and update
; AL=2: Write and update
deblock$io: ; CODE XREF: deblock+F6p deblock+125p
; ...
push ax
call seek
pop ax
dec al
js rwb_fn0
jnz rwb_fn1
mov cl, 1
jmp wrbuff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rwb_fn1: ; CODE XREF: deblock$io+9j
call rdbuff
rwb_fn0: ; CODE XREF: deblock$io+7j
mov si, offset fs_track
mov di, curbcba
add di, 6
mov cx, 2
rep movsw
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ddta_1: ; CODE XREF: fat_rdwr_ckd+1Dj
mov ah, 1
test cl, cl
jnz ddta_2
inc ah
ddta_2: ; CODE XREF: bdos:2EF6j
mov fat_buf_dirty?, ch
jmp deblock$dta
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
go_rdbuff: ; CODE XREF: bdos:3D1Fj
mov ah, 1
call deblock$dta
jmp setfcb ; Place values back into current FCB
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
deblock: ; CODE XREF: bdos:3207p
mov word ptr fs_buffer, ds
mov bx, dph_dirbcb
cmp ah, 5
jnz deblock1a
mov bx, curbcba
jmps deblock1a
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock$dta: ; CODE XREF: bdos:2EFEj bdos:2F03p
; ...
mov bx, dph_dtabcb
mov word ptr fs_buffer, 0
cmp ah, 4
jnz deblock1a
deblock$flush: ; CODE XREF: deblock+74j
mov bx, [bx]
mov fs_track, 0FFFFh
; Search for dirty BCB with lowest track number
deblock$flush1: ; CODE XREF: deblock+55j
mov al, bcb_drive ; Does current drive own BCB?
cmp al, [bx]
jnz deblock$flush2
test byte ptr 4[bx], 0FFh; Is buffer dirty?
jz deblock$flush2 ; No
mov ax, 14[bx] ; Owned by current process?
cmp ax, rlr
jnz deblock$flush2 ; No
mov ax, 6[bx] ; Is bcb(6) < track?
cmp ax, fs_track
jnb deblock$flush2
mov fs_track, ax
mov fs_sector, bx
deblock$flush2: ; CODE XREF: deblock+2Fj deblock+35j
; ...
mov bx, 12[bx]
or bx, bx ; Got to end yet?
jnz deblock$flush1
cmp fs_track, 0FFFFh
jnz deblock$flush3
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock$flush3: ; CODE XREF: deblock+5Cj
mov bx, fs_sector
xor al, al
mov ah, 4
mov word ptr fs_buffer, 0
call deblock1a ; Flush BCB
mov bx, dph_dtabcb
jmps deblock$flush
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock1a: ; CODE XREF: deblock+Bj deblock+11j
; ...
mov deblock_command, ah
lahf
mov cl, dpb_phm
mov al, byte ptr bcb_record
and al, cl
mov phy$off, al ; phy$off = low(arecord) & phymsk
not cl ; arecord &= ~phymsk
and byte ptr bcb_record, cl
sahf
jz deblock1b
call get$bcba
deblock1b: ; CODE XREF: deblock+8Ej
mov curbcba, bx
mov ax, 10[bx]
cmp word ptr fs_buffer, 0
jnz deblock1c
mov word ptr fs_buffer, ax
xor ax, ax
deblock1c: ; CODE XREF: deblock+9Fj
mov word ptr fs_buffer+2, ax
mov al, deblock_command
cmp al, 3
jnz deblock1d
xor ah, ah
xchg ah, dir_check_flag
test ah, 0F0h
jnz deblock25
deblock1d: ; CODE XREF: deblock+AEj
call set$arecord
cmp byte ptr [bx], 0FFh
jz deblock2
cmp al, 4
jnb deblock1e
call compare ; Compare CL bytes at DX and BX
jz deblock2b
deblock1e: ; CODE XREF: deblock+C5j
cmp al, 5
jz deblock15
test byte ptr 4[bx], 0FFh
jz deblock2
deblock15: ; CODE XREF: deblock+CEj
push word ptr bcb_drive
push bcb_record+1
mov ax, 2[bx]
mov bcb_record+1, ax
mov ax, [bx]
mov word ptr bcb_drive, ax
cmp curdsk, al
jz deblock15a
call disk$select1
deblock15a: ; CODE XREF: deblock+EDj
mov al, 1
jnz deblock15b
call deblock$io ; Read/write a sector and/or update the current BCB with its address
; AL=0: Update BCB
; AL=1: Read and update
; AL=2: Write and update
deblock15b: ; CODE XREF: deblock+F4j
call set$arecord
mov byte ptr 4[bx], 0
call move ; Copy CL bytes from DX to BX
pop bcb_record+1
pop word ptr bcb_drive
call curselect
deblock2: ; CODE XREF: deblock+C1j deblock+D4j
mov al, deblock_command
cmp al, 4
jb deblock2a
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock2a: ; CODE XREF: deblock+113j
cmp al, 2
jnz deblock25
mov cl, blk$off
call lru_ckdirty ; Returns Carry set if buffer dirty?
jb deblock25
xor al, al ; Clean. Just update BCB trk/sec
call deblock$io ; Read/write a sector and/or update the current BCB with its address
; AL=0: Update BCB
; AL=1: Read and update
; AL=2: Write and update
jmps deblock4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock2b: ; CODE XREF: deblock+CAj
cmp al, 2
jnz deblock45
mov cl, blk$off
push bx
call lru_ckdirty ; Returns Carry set if buffer dirty?
pop bx
jmps deblock45
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock25: ; CODE XREF: deblock+B9j deblock+118j
; ...
mov bx, curbcba
mov byte ptr [bx], 0FFh
mov al, 2
call deblock$io ; Read/write a sector and/or update the current BCB with its address
; AL=0: Update BCB
; AL=1: Read and update
; AL=2: Write and update
deblock4: ; CODE XREF: deblock+128j
call set$arecord
call move ; Copy CL bytes from DX to BX
mov byte ptr [di], 0
deblock45: ; CODE XREF: deblock+12Cj deblock+137j
xor al, al
mov ah, phy$off
shr ax, 1
mov si, word ptr fs_buffer+2
add si, ax
mov al, deblock_command
cmp al, 3
jnz deblock6
mov buffa, si
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
deblock6: ; CODE XREF: deblock+161j
mov cx, 40h
mov di, userdma
cmp al, 1
mov ax, userdmaseg
mov dx, word ptr fs_buffer
push ds
push es
jz deblock7
mov byte ptr 4[bx], 0FFh
xchg di, si
xchg ax, dx
deblock7: ; CODE XREF: deblock+17Aj
mov ds, dx
mov es, ax
rep movsw
pop es
pop ds
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$arecord: ; CODE XREF: get$bcba+58p deblock+BBp
; ...
mov bx, curbcba
mov dx, offset bcb_drive
mov cl, 4
read$dir_ret: ; CODE XREF: read$dir+8j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
read$dir: ; CODE XREF: read$subdir+28p
; cpm_login+48p ...
call r$dir
test relog, 0FFh ; Inlined r$dir1
jz read$dir_ret
call chk$exit$fxs
call tst$relog
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
rd$dir: ; CODE XREF: r$dir+2Ep
mov ax, dcnt
mov cl, 2
shr ax, cl
mov drec, ax
mov bcb_record, ax
mov bcb_record_h, 0
mov ah, 3
jmp wrdir0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
read$subdir: ; CODE XREF: rd$parentdir+35p
; rd$parentdir+67j ...
mov bx, cur_drvdir
or bx, bx
jz read$subdir2
mov si, lsn$add
mov al, 2[si]
cmp al, 1[bx]
jz read$subdir1
mov 1[bx], al
mov word ptr 6[bx], 0
read$subdir1: ; CODE XREF: read$subdir+12j
test word ptr 6[bx], 0FFFFh
jz read$subdir2
call rd$subdir1
jmps read$subdir3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
read$subdir2: ; CODE XREF: read$subdir+6j
; read$subdir+21j
call read$dir
read$subdir3: ; CODE XREF: read$subdir+26j
call end$of$dir
jnz read$subdir4
xor ax, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
read$subdir4: ; CODE XREF: read$subdir+2Ej
call getdptra
mov ax, bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
rd$subdir1: ; CODE XREF: read$subdir+23p
mov dx, dcnt
inc dx
mov dcnt, dx
mov ax, dname_cluster
or ax, ax
jnz rd$subdir2
mov ax, 20h
mul dx
div dpb_clustersize
mov dx, ax
mov ax, 6[bx]
jmps rd$subdir3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rd$subdir2: ; CODE XREF: rd$subdir1+Ej
and dx, names_per_block
or dx, dx
jnz rd$subdir4
mov dx, 1
rd$subdir3: ; CODE XREF: rd$subdir1+1Ej
; rd$subdir1+39j
or dx, dx
jz rd$subdir4
dec dx
push dx
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
pop dx
cmp ax, dpb_clusters
jb rd$subdir3
jmp set$end$dir
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rd$subdir4: ; CODE XREF: rd$subdir1+26j
; rd$subdir1+2Dj
mov dname_cluster, ax
mov dl, byte ptr dcnt
and dl, 3
mov cl, 5
shl dl, cl
mov dptr, dl
mov dh, dir_check_flag
or dh, dh
jnz rd$subdir5
or dl, dl
jnz rd$subdir6
rd$subdir5: ; CODE XREF: rd$subdir1+56j
push dx
mov bx, dcnt
and bx, names_per_block
mov cl, 5
shl bx, cl
call clus_to_sec
mov ah, 3
call wrdir0
pop dx
test dh, 0F0h
jz rd$subdir6
call rd$parentdir
rd$subdir6: ; CODE XREF: rd$subdir1+5Aj
; rd$subdir1+75j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
rd$parentdir: ; CODE XREF: rd$subdir1+77p
mov dname_cluster, 0
mov bx, cur_drvdir
mov ax, 2[bx] ; Parent dir
cmp ax, 6[bx] ; This dir
jz rd$subdir6
push dcnt
push word ptr 6[bx] ; Cluster of this dir
push bx ; Structure
or ax, ax
jnz rd$parentdir1
mov cur_drvdir, 0
jmps rd$parentdir2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rd$parentdir1: ; CODE XREF: rd$parentdir+1Cj
mov 6[bx], ax ; CWD is now parent
rd$parentdir2: ; CODE XREF: rd$parentdir+24j
mov ax, 4[bx] ; Dir entry number in previous parent
dec ax
mov dcnt, ax
mov dir_check_flag, 0F0h
call read$subdir
pop si
mov cur_drvdir, si
pop ax
mov 6[si], ax ; Cluster of CWD
pop dcnt
dec dcnt
mov dname_cluster, 0
or bx, bx
jz rd$parentdir3
test byte ptr 11[bx], 10h
jz rd$parentdir3
cmp ax, 26[bx]
jz rd$parentdir4
rd$parentdir3: ; CODE XREF: rd$parentdir+51j
; rd$parentdir+57j
call media$change
call chk$exit$fxs
jmp tst$relog
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rd$parentdir4: ; CODE XREF: rd$parentdir+5Cj
jmp read$subdir
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
seek$copy: ; CODE XREF: delete11+1Dp copy$dir0+9j
; ...
call check$write
mov ah, 5
call wrdir0
cmp F_isfatfs, 0
jz wr_root_dirent
mov bx, cur_drvdir ; No CWD?
or bx, bx
jz wr_root_dirent
cmp word ptr 6[bx], 0; Or CWD is root?
jz wr_root_dirent
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wr_root_dirent: ; CODE XREF: seek$copy+Dj seek$copy+15j
; ...
mov cl, 0FDh
jmp checksum
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wrdir0: ; CODE XREF: rd$dir+14j rd$subdir1+6Ep
; ...
call deblock
setdata: ; CODE XREF: bdos:2C5Ap bdos:3D22p
; ...
mov ax, userdmaseg
mov word ptr fs_buffer, ax
mov ax, userdma
mov word ptr fs_buffer+2, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
r$dir: ; CODE XREF: read$dirp check$media+19p
mov dx, dpb_drm
mov bx, dcnt
inc bx
mov dcnt, bx
sub dx, bx
jnb read$dir0
jmp set$end$dir
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
read$dir0: ; CODE XREF: r$dir+Fj
mov al, byte ptr dcnt
and al, 3 ; low(dcnt) and dskmsk
push cx
mov cl, 5
shl al, cl ; Multiply by FCB size
pop cx
mov dptr, al
test dir_check_flag, 0FFh
jnz read$dir2
or al, al ; Return if not a new record
jnz read_dir_ret
read$dir2: ; CODE XREF: r$dir+27j
push cx
call rd$dir
pop cx
test relog, 0FFh
jnz read_dir_ret
checksum: ; CODE XREF: seek$copy+20j
mov dx, drec
mov bx, dpb_cks
and bh, 7Fh ; Mask off fixed disk bit
sub dx, bx
jnb read_dir_ret ; Skip if > CSV size
push cx
call compute$cs ; Compute checksum for current directory buffer
mov bx, drec
add bx, dph_csv
pop cx
inc cl
jz initial$cs
inc cl
inc cl
jz update$cs
cmp al, [bx]
jz read_dir_ret
call nowrite ; Return true if drive is software R/O
jnz read_dir_ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
media$change: ; CODE XREF: rdbuff+31p rd$parentdir+5Ep
mov bx, dph_dtabcb
call discard$data ; Called with BX->BCB chain head. Release all BCBs for a drive
mov al, 0FFh
mov relog, al
mov hashl, al
mov bx, offset removable_drive
call set$cdisk
jmp reset37x
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
initial$cs: ; CODE XREF: r$dir+57j
cmp al, [bx]
mov [bx], al
jz read_dir_ret
mov bx, lsn$add
or byte ptr 2[bx], 1
read_dir_ret: ; CODE XREF: r$dir+2Bj r$dir+37j
; ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
update$cs: ; CODE XREF: r$dir+5Dj
mov [bx], al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
getallocbit: ; CODE XREF: set$alloc$bit+1p
; get$block+Dp ...
mov bx, cx
and cl, 7
inc cl
mov ch, cl
mov cl, 3
shr bx, cl
add bx, dph_alv
mov al, [bx]
mov cl, ch
rol al, cl
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$alloc$bit: ; CODE XREF: scandm$a+3Fp
push dx
call getallocbit
and al, 0FEh
pop dx
or al, dl
rotr: ; CODE XREF: get$block+2Cp
ror al, cl
mov [bx], al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Return ALV size in bytes
get$nalbs: ; CODE XREF: copy$alv+8p scandm$ab+6p
; ...
mov bx, dpb_dsm
mov cl, 3
shr bx, cl
inc bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy$alv: ; CODE XREF: cpm_login+52j
; DRV_FLUSH+31p ...
cmp F_isfatfs, 0
jnz dont_copy_alv
pushf
call get$nalbs ; Return ALV size in bytes
mov si, dph_alv
mov di, si
add di, bx
mov cx, bx
push cs
call f_interrupt ; Z should still be set from above
jz do_copy_alv
xchg si, di
do_copy_alv: ; CODE XREF: copy$alv+19j
rep movsb
dont_copy_alv: ; CODE XREF: copy$alv+5j
call lru_free ; Free all LRU buffers for drive bcb_drive
scandm_ret: ; CODE XREF: scandm$a+10j
retn
;
; Set/Reset first ALV
;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
scandm$a: ; CODE XREF: scandm$ab+1p scandm$ab+13p
; ...
call getdptra
add bx, 10h
push cx
mov cl, 11h
scandm0: ; CODE XREF: scandm$a+45j
pop dx
dec cl
jnz scandm0a
or dl, dl
jnz scandm_ret
mov bx, dph_alv
mov ax, dpb_al0_al1
or [bx], ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scandm0a: ; CODE XREF: scandm$a+Cj
push dx
cmp single, 0 ; Nonzero if using 8-bit blocks
jz scandm1
push cx
push bx
mov cl, [bx]
mov ch, 0
jmps scandm2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scandm1: ; CODE XREF: scandm$a+22j
dec cl
push cx
mov cx, [bx]
inc bx
push bx
scandm2: ; CODE XREF: scandm$a+2Aj
or cx, cx
jz scandm3
mov bx, dpb_dsm
cmp bx, cx
jb scandm3
call set$alloc$bit
scandm3: ; CODE XREF: scandm$a+35j scandm$a+3Dj
pop bx
inc bx
pop cx
jmps scandm0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
scandm$ab: ; CODE XREF: delete11+28p F_TRUNCATE+70p
; ...
push cx
call scandm$a
pop cx
scandm$b: ; CODE XREF: close$fcb+A0p
push cx
call get$nalbs ; Return ALV size in bytes
pop cx
mov ax, dph_alv
push ax
add ax, bx
mov dph_alv, ax
call scandm$a
pop dph_alv
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cpm_login: ; CODE XREF: curselect+15p
cmp dpb_cks, 8000h
jnz cpm_loginfixed
mov bx, lsn$add
test byte ptr 2[bx], 0FFh
jnz initial2a
cpm_loginfixed: ; CODE XREF: cpm_login+6j
mov bx, dph_dtabcb
call discard$data ; Called with BX->BCB chain head. Release all BCBs for a drive
call discard$dir ; Release all directory BCBs for a drive
call get$nalbs ; Return ALV size in bytes
mov cx, bx
mov di, dph_alv
mov ax, dpb_al0_al1
stosw ; Reserve directory blocks
dec cx
dec cx
xor ax, ax
rep stosb ; Rest of ALV to zero
mov bx, lsn$add
mov [bx], al
mov 1[bx], al ; Home the disk
mov bcb_dirty, ax
mov bx, cdrmaxa
mov word ptr [bx], 4
call set$end$dir
initial2: ; CODE XREF: cpm_login+5Fj
; cpm_login+63j ...
mov cl, 0FFh
call read$dir
call end$of$dir
jnz initial2b
xor al, al
initial2a: ; CODE XREF: cpm_login+10j
jmp copy$alv
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
initial2b: ; CODE XREF: cpm_login+4Ej
call fix$hash
call getdptra
mov al, [bx]
cmp al, 21h ; Skip date/time records
jz initial2
cmp al, 0E5h ; Skip deleted files
jz initial2
cmp al, 20h ; Skip labels
jz drv$lbl
test al, 10h
jnz initial3
mov cl, 1 ; Scan for allocated blocks
call scandm$a
initial3: ; CODE XREF: cpm_login+6Bj
; cpm_login+80j
call setcdr
jmps initial2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
drv$lbl: ; CODE XREF: cpm_login+67j
mov al, 12[bx]
mov bx, lsn$add
mov [bx], al
jmps initial3
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_login: ; CODE XREF: curselect+1Ap
cmp dpb_cks, 8000h
jnz fat_log_hd
mov bx, lsn$add
test byte ptr 2[bx], 0FFh
jnz fat_initial2a
fat_log_hd: ; CODE XREF: fat_login+6j
mov bx, dph_dtabcb
call discard$data ; Called with BX->BCB chain head. Release all BCBs for a drive
call discard$dir ; Release all directory BCBs for a drive
xor al, al
mov bx, lsn$add
mov [bx], al
mov 1[bx], al
mov bx, cdrmaxa
mov word ptr [bx], 4
call set$end$dir
fat_initial2: ; CODE XREF: fat_login+46j
; fat_login+4Aj ...
mov cl, 0FFh
call read$dir
call end$of$dir
jnz fat_initial3
xor al, al
fat_initial2a: ; CODE XREF: fat_login+10j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_initial3: ; CODE XREF: fat_login+3Aj
call getdptra
mov al, [bx]
or al, al ; End of dir
jz fat_initial2
cmp al, 0E5h ; Deleted
jz fat_initial2
call setcdr
jmps fat_initial2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
copy$dir$loc: ; CODE XREF: delete10+2j bdos:47FCj
; ...
mov al, dirloc
jmp sta$ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chk$wild_cpm: ; CODE XREF: set$hash+2Dp cpm_delete+2Ap
; ...
xor dl, dl
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$wild0: ; CODE XREF: valid_dl_f_fcb+3p
; bdos:47B1p ...
mov cx, 0Bh
mov si, bx
inc si
chk_fcb_char: ; CODE XREF: check$wild0+19j
lodsb
and al, 7Fh
cmp al, '?'
jz set$hashret
or dl, dl
jz chk_fcb_dl0
cmp al, '['
jz set$hashret
cmp al, ']'
jz set$hashret
chk_fcb_dl0: ; CODE XREF: check$wild0+Fj
loop chk_fcb_char
or al, 1
set$hashret: ; CODE XREF: check$wild0+Bj
; check$wild0+13j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$wild: ; CODE XREF: F_OPEN+29p bdos:4790p
; ...
xor dl, dl
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
valid_dl_f_fcb: ; CODE XREF: F_MAKE+10p
mov bx, offset user_fcb
call check$wild0
jnz set$hashret
mov ah, 9
jmp disk_error
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$hash: ; CODE XREF: searchi+10p
cmp dph_hash, 0
jz set$hashret
or cl, cl
jz set$hashret
cmp cl, 0Ch
jb set$hash2
mov al, 2
jz set$hash1
mov al, 3
set$hash1: ; CODE XREF: set$hash+12j
mov hashl, al
mov al, fs_function
cmp al, 3
jz get$hash
cmp al, 11h
jz set$hash15
cmp al, 7
jnb get$hash
set$hash15: ; CODE XREF: set$hash+22j
mov hashl, 2
call chk$wild_cpm
jnz get$hash
set$hash2: ; CODE XREF: set$hash+Ej
mov hashl, 0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$hash: ; CODE XREF: set$hash+1Ej set$hash+26j
; ...
mov si, bx
lodsb
mov hash, al
xor bx, bx
and al, 20h
jz get$hash0
or hash, 10h
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
get$hash0: ; CODE XREF: get$hash+Aj
mov dl, al
mov cx, 0Bh
get$hash1: ; CODE XREF: get$hash+40j
cmp cl, 6
jz get$hash3
cmp cl, 4
jz get$hash3
shl bx, 1
rcl dl, 1
test cl, 1
jnz get$hash3
shl bx, 1
rcl dl, 1
get$hash3: ; CODE XREF: get$hash+1Aj get$hash+1Fj
; ...
lodsb
and al, 7Fh
sub al, 20h
ror al, 1
jnb get$hash4
rol al, 1
get$hash4: ; CODE XREF: get$hash+35j
xor ah, ah
add bx, ax
adc dl, 0
loop get$hash1
mov word ptr hash+1, bx
mov bx, offset hash
and dl, 3
ror dl, 1
ror dl, 1
or [bx], dl
lodsb
and al, 1Fh
inc si
mov ah, [si]
and ah, 3Fh
mov cl, 3
shl al, cl
shr ax, cl
mov dl, dpb_exm
shl ax, 1
get$hash5: ; CODE XREF: get$hash+6Bj
shr ax, 1
shr dl, 1
jb get$hash5
and ah, 1
ror ah, cl
or [bx], ah
mov 3[bx], al
get$hashret: ; CODE XREF: search$hash+5j
; search$hash+Cj ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
search$hash: ; CODE XREF: searchn+5p
cmp dph_hash, 0
jz get$hashret
mov al, searchl
or al, al
jz get$hashret
cmp hashl, 0FFh
jz get$hashret
mov bx, cdrmaxa
mov cx, [bx]
dec al
jnz search$h0
mov cx, dpb_drm
search$h0: ; CODE XREF: search$hash+1Dj
mov bx, dcnt
sub cx, bx
jz get$hashret
mov es, dph_hash
inc bx
mov di, bx
shl di, 1
shl di, 1
sub di, 4
call search$h_sub
mov ax, ds
mov es, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
search$h_sub: ; CODE XREF: search$hash+39p
; search$h_sub+16j
add di, 4
mov si, offset hash
lodsb
xor al, es:[di]
mov dl, al
and al, 1Fh
jnz search$h2b
call search$h6
jz search$h2g
search$h2: ; CODE XREF: search$h_sub+39j
; search$h_sub+3Fj ...
inc bx
loop search$h_sub
cmp dcnt, 0FFFFh
jnz search$h2a
mov ax, ds
mov es, ax
call tst$log$fxs
jnz search$h2a
mov hashl, 0FFh
search$h2a: ; CODE XREF: search$h_sub+1Dj
; search$h_sub+26j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$h2b: ; CODE XREF: search$h_sub+Ej
mov al, byte ptr xdcnt+1
inc al
jnz search$h2c
cmp es:byte ptr [di], 0F5h
jnz search$h2
jmps search$h2d
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$h2c: ; CODE XREF: search$h_sub+33j
inc al
jnz search$h2
call search$h6
jnz search$h2
mov al, find$xfcb
inc al
jnz search$h2e
test es:byte ptr [di], 10h
jz search$h2
test dl, 0Fh
jnz search$h2
search$h2d: ; CODE XREF: search$h_sub+3Bj
mov xdcnt, bx
jmps search$h2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$h2e: ; CODE XREF: search$h_sub+4Bj
inc al
jnz search$h2f
test dl, 0Fh
jnz search$h2
jmps search$h2g
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$h2f: ; CODE XREF: search$h_sub+60j
test es:byte ptr [di], 1Fh
jnz search$h2
search$h2g: ; CODE XREF: search$h_sub+13j
; search$h_sub+67j
mov dx, dcnt
dec bx
mov dcnt, bx
mov al, bl
and al, 3
cmp al, 3
jz search$hret
and bl, 0FCh
and dl, 0FCh
cmp bx, dx
jz search$hret
or dir_check_flag, 0Fh
xor al, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
search$h6: ; CODE XREF: search$h_sub+10p
; search$h_sub+41p
mov al, hashl
or al, al
jz search$hret
mov ah, 0E0h
cmp al, 3
jz search$h6a
mov ah, 0C0h
search$h6a: ; CODE XREF: search$h6+Bj
test dl, ah
jnz search$hret
xor ah, ah
xchg ax, cx
push di
inc di
rep cmpsb
xchg ax, cx
pop di
search$hret: ; CODE XREF: search$h_sub+7Ej
; search$h_sub+88j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fix$hash: ; CODE XREF: cpm_login+55p
; delete11+2Bp ...
cmp dph_hash, 0
jz search$hret
push word ptr hash
push word ptr hash+2
call getdptra
call get$hash
mov ax, dcnt
shl ax, 1
shl ax, 1
mov di, ax
mov es, dph_hash
mov si, offset hash
mov cx, 2
rep movsw
mov ax, ds
mov es, ax
pop word ptr hash+2
pop word ptr hash
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
save$dcnt$pos1: ; CODE XREF: searchn+34p searchn+56p
cmp byte ptr xdcnt+1, 0FFh
jnz search$hret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
save$dcnt$pos0: ; CODE XREF: bdos:3716p bdos:3737p
; ...
mov ax, dcnt
mov xdcnt, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
searchi: ; CODE XREF: search$extnum+2p
; restore_dir_fcb+5p
; ...
mov bx, offset user_fcb
mov searcha, bx
searchi1: ; CODE XREF: does$xfcb$exist+18p
; bdos:47BAp
mov dirloc, 0FFh
mov searchl, cl
call set$hash
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Find the first extent of a file
find_extent_0: ; CODE XREF: update$stamp+16p
; F_TIMEDATE+10p ...
xor ax, ax
mov user_fcb+0Ch, al
mov user_fcb+0Eh, al
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Find a numbered extent
search$namlen: ; CODE XREF: openp close$fcb+Cp
; ...
mov cl, 0Fh
jmps search
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Find any extent of a file
search$extnum: ; CODE XREF: cpm_delete+8p
; cpm_delete+47p ...
mov cl, 0Ch
search: ; CODE XREF: search$namlen+2j
; F_SFIRST+4Ap ...
call searchi
search1: ; CODE XREF: bdos:47BDp
call set$end$dir ; Entry point used by rename
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Search for the next directory element,
; assuming a previous call on search
searchn: ; CODE XREF: searchn+4Fj bdos:3719j
; ...
mov user0$pass, 0 ; Don't try user 0 yet
call search$hash
jnz search$fin
mov cl, 0
call read$dir ; Read next dir element
call end$of$dir
jz search$fin
mov dx, searcha ; Not end of dir, scan for match
mov si, dx
lodsb
cmp al, 0E5h
jz searchnext ; Keep scanning if empty
push dx ; Not empty, may be end of logical directory
call compcdr ; Past logical end?
pop dx
jnb search$fin ; Artificial stop
searchnext: ; CODE XREF: searchn+1Dj
call getdptra ; BX = buffa + dptr
mov cl, searchl ; CL = length of search
xor ch, ch ; CH counts up, CL counts down
cmp byte ptr [bx], 0E5h
jnz srchnxt1
call save$dcnt$pos1
srchnxt1: ; CODE XREF: searchn+32j
mov save$xfcb, 0
mov al, [bx]
and al, 0EFh ; Is this an XFCB?
cmp al, [bx]
jz search$loop
mov si, dx
cmp al, [si]
jnz search$loop
mov al, find$xfcb
or al, al
jz searchn ; Search for the next directory element,
; assuming a previous call on search
mov save$xfcb, al
jmps searchok
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$fin: ; CODE XREF: searchn+8j searchn+12j
; ...
call save$dcnt$pos1
call set$end$dir
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
lret$eq$ff: ; CODE XREF: chk$exit$fxs+17j
; rdbuff+56p ...
mov al, 0FFh
mov ch, al
inc ch
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
search$loop: ; CODE XREF: searchn+42j searchn+48j
; ...
or cl, cl
jz endsearch
mov si, dx
lodsb
cmp ch, 0Eh
jnz not_modnum
and al, 3Fh ; Mask off high 2 bits
jmps was_modnum
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
not_modnum: ; CODE XREF: bdos:36E1j
and al, 7Fh
cmp al, '?' ; "?" in user FCB matches all
jz searchok
cmp ch, 0Dh ; If S1, continue
jz searchok
cmp ch, 0Ch ; Extent?
jz searchext
was_modnum: ; CODE XREF: bdos:36E5j
sub al, [bx]
and al, 7Fh ; Mask out flags/extent modulus
jnz searchnm ; Skip if not matched
jmps searchok
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
searchext: ; CODE XREF: bdos:36F5j
push cx
mov cl, [bx]
call compext ; Compare extent nos in AL and CL
; Return nonzero if they do not match
pop cx
jnz j_searchn ; No match
test user0$pass, 0FFh
jz disable_user0
;
; inlined save$dcnt$pos2
;
inc bx
inc bx
cmp byte ptr [bx], 0
jnz j_searchn
call save$dcnt$pos0
jmp searchn ; Search for the next directory element,
; assuming a previous call on search
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Disable search of user 0 if any fcb is found under
; the current user number
;
disable_user0: ; CODE XREF: bdos:370Dj
mov search$user0, 0
searchok: ; CODE XREF: searchn+54j bdos:36EBj
; ...
inc dx
inc bx
inc ch
dec cl
jmps search$loop
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Entire name matches, return dir position
;
endsearch: ; CODE XREF: bdos:36D9j
cmp save$xfcb, 0FFh
jnz endsearch1
cmp byte ptr xdcnt+1, 0FEh
jnz j_searchn
call save$dcnt$pos0
j_searchn: ; CODE XREF: bdos:3706j bdos:3714j
; ...
jmp searchn ; Search for the next directory element,
; assuming a previous call on search
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
endsearch1: ; CODE XREF: bdos:372Ej
xor al, al
mov dirloc, al
mov byte ptr aret, al
;
; Successful search - return with zero flag reset
;
mov ch, al
inc ch
endsearch_ret: ; CODE XREF: does$xfcb$exist+5j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; Search no match routine
searchnm: ; CODE XREF: bdos:36FBj
or ch, [bx]
jnz j_searchn ; fcb(0)?
test search$user0, 0FFh
jz j_searchn ; dir fcb(0)=0?
mov user0$pass, 0FFh
jmps searchok
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
init_xfcb_srch: ; CODE XREF: bdos:47A5p bdos:47DCp
mov al, 0FFh
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
init_xfcb_srch1: ; CODE XREF: does$xfcb$exist+Cp
; cpm_delete+5p
mov find$xfcb, al
mov al, 0FEh
mov byte ptr xdcnt+1, al
init_xfcbs_ret: ; CODE XREF: cpm_delete+Bj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
does$xfcb$exist: ; CODE XREF: bdos:47D1p bdos:47F7p
cmp byte ptr xdcnt+1, 0FEh
jz endsearch_ret
call set_dcnt_dblk
xor al, al
call init_xfcb_srch1
mov bx, searcha
or byte ptr [bx], 10h
mov cl, 0Ch
call searchi1
jmp searchn ; Search for the next directory element,
; assuming a previous call on search
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
xdcnt_eq_dcnt: ; CODE XREF: openx+42p openx+62p
; ...
mov ax, dcnt
mov xdcnt, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
restore_dir_fcb: ; CODE XREF: openx+4Ap openx+87p
; ...
call set_dcnt_dblk
mov cl, 0Fh
call searchi
jmp searchn ; Search for the next directory element,
; assuming a previous call on search
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cpm_delete: ; CODE XREF: F_DELETE+1Bj
call get$atts
deletex: ; CODE XREF: cpm_delete+40j
mov al, 0FEh ; Make search return matching
; fcbs and xfcbs
call init_xfcb_srch1
call search$extnum ; Find any extent of a file
jz init_xfcbs_ret
delete00: ; CODE XREF: cpm_delete+45j
call getdptra
mov al, [bx]
and al, 10h ; Is it an xfcb?
jnz delete01 ; yes
test attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jnz delete00a
call check$rodir
delete00a: ; CODE XREF: cpm_delete+1Bj
call get$dir$mode
rol al, 1 ; Delete requires password?
jb delete02 ; No
mov bx, offset user_fcb
call chk$wild_cpm ; Is this a wildcard delete?
jz delete02
;
; Not wild and passwords inactive
; Skip to pass 2
;
jmps delete11
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Check XFCB password if passwords enabled
;
delete01: ; CODE XREF: cpm_delete+14j
call get$dir$mode
rol al, 1
jnb delete02
call chk_xfcb_passwd
jz delete02
call chk$pw$error
jmps deletex
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
delete02: ; CODE XREF: cpm_delete+25j
; cpm_delete+2Dj ...
call searchn ; Search for the next directory element,
; assuming a previous call on search
jnz delete00
call search$extnum ; Find any extent of a file
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
delete10: ; CODE XREF: delete11+31j F_MAKE+ABp
jnz delete11
jmp copy$dir$loc
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
delete11: ; CODE XREF: cpm_delete+2Fj
; delete10j ...
call getdptra
mov al, [bx] ; Is addressed dir fcb an xfcb?
and al, 10h
jnz delete12
test attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jnz delete13
delete12: ; CODE XREF: delete11+7j
mov byte ptr [bx], 0E5h; Delete dir FCB or XFCB
delete13: ; CODE XREF: delete11+Ej
pushf
call get$dtba$8 ; Does SFCB exist?
or al, al
jnz delete13a
mov [bx], al ; If so, zero its mode byte
delete13a: ; CODE XREF: delete11+19j
call seek$copy
push cs
call f_interrupt
jnz delete13b
mov cl, 0
call scandm$ab
delete13b: ; CODE XREF: delete11+24j
call fix$hash
call searchn ; Search for the next directory element,
; assuming a previous call on search
jmps delete10
;
; Given allocation vector position CX, find the closest zero bit
; by searching left and right. If found, set the bit to 1 and
; return the bit position in BX. If not found return BX=0
;
;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$block: ; CODE XREF: cpm_writerec+5Fp
mov dx, cx
righttst: ; CODE XREF: get$block+18j
; get$block+26j
cmp dx, dpb_dsm
jnb retblock0
inc dx
push cx
push dx
mov cx, dx
call getallocbit
rcr al, 1
jnb retblock
pop dx
pop cx
lefttst: ; CODE XREF: get$block+44j
or cx, cx
jz righttst
dec cx
push dx
push cx
call getallocbit
rcr al, 1
jnb retblock
pop cx
pop dx
jmps righttst
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
retblock: ; CODE XREF: get$block+12j
; get$block+22j
rcl al, 1
inc al
call rotr
mov cl, curdsk
mov bx, offset proc_using_drvs
push ds
mov ds, rlr
call set$cdisk1
pop ds
pop bx
pop dx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
retblock0: ; CODE XREF: get$block+6j
or cx, cx
jnz lefttst
mov bx, cx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy$dir2: ; CODE XREF: copy$dir0p F_ATTRIB+27p
push dx
mov ch, 0
mov dx, offset user_fcb
add dx, cx
call getdptra
pop cx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Copy FCB information starting at CL for DL bytes
; into the currently addressed directory entry
copy$dir: ; CODE XREF: bdos:47ECp
mov dh, 80h
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy$dir0: ; CODE XREF: make+59p
call copy$dir2
inc cl
copy$dir1: ; CODE XREF: copy$dir0+1Bj
dec cl
jnz copy$dir1a
jmp seek$copy
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
copy$dir1a: ; CODE XREF: copy$dir0+7j
mov ah, [bx]
and ah, ch
mov si, dx
lodsb
and al, 7Fh
or al, ah
mov [bx], al
inc bx
inc dx
jmps copy$dir1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy$user$no: ; CODE XREF: bdos:47A8p bdos:47D9p
; ...
mov al, user_fcb
mov bx, offset user_fcb+10h
mov [bx], al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
open: ; CODE XREF: cpm_rwrand+89p
; F_OPEN+3Dp ...
call search$namlen ; Find a numbered extent
open1: ; CODE XREF: F_OPEN+6Ap
jz set$rcret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
open$copy: ; CODE XREF: open$reel+52p
call setfwf
push bx ; BX->S2
dec bx
dec bx ; BX->EX
mov ah, [bx]
push ax ; AH=EX AL=S2
call getdptra
mov dx, bx
mov bx, offset user_fcb
mov cl, 20h
call move ; Copy CL bytes from DX to BX
call get$dir$ext ; Compute directory extent from FCB
mov cl, al
pop ax ; Restore original EX and S2
pop bx
mov [bx], al
dec bx
dec bx
mov [bx], ah
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$rc: ; CODE XREF: getfcb+12p close+27p
; ...
xor ch, ch
mov si, offset user_fcb+0Fh
mov al, [bx]
sub al, cl
jz set$rc2
mov al, ch
jnb set$rc1
mov al, 80h
or al, [si]
set$rc1: ; CODE XREF: set$rc+Dj
mov [si], al
set$rcret: ; CODE XREF: open+3j set$rc+18j
; ...
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
set$rc2: ; CODE XREF: set$rc+9j
cmp [si], al
jnz set$rcret
set$rc3: ; CODE XREF: close$fcb+86p
; F_TRUNCATE+CDp ...
xor al, al
mov [si], al
cmp dminx, al
jz set$rcret
mov byte ptr [si], 80h
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
restore$rc: ; CODE XREF: close+20p open$reel+9Cp
; ...
mov al, user_fcb+0Fh
cmp al, 81h
jb restore$rc1
and al, 7Fh
mov user_fcb+0Fh, al
restore$rc1: ; CODE XREF: restore$rc+5j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
mergezero: ; CODE XREF: close$fcb+40p
; close$fcb+45p
cmp word ptr [bx], 0
jnz mzero_ret
mov si, dx
lodsw
mov [bx], ax
mzero_ret: ; CODE XREF: mergezero+3j close$fcb+Fj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
close$fcb: ; CODE XREF: close+2Ap
test byte ptr dpb_cks+1, 80h
jnz close$fcb0
mov dir_check_flag, 0F0h
close$fcb0: ; CODE XREF: close$fcb+5j
call search$namlen ; Find a numbered extent
jz mzero_ret
call getdptra
add bx, 10h
mov dx, bx
mov bx, offset user_fcb+10h
mov cl, 10h
merge0: ; CODE XREF: close$fcb+5Aj
cmp single, 0 ; Nonzero if using 8-bit blocks
jz merged
mov al, [bx]
or al, al
mov si, dx
lodsb
jnz fcbnzero
mov [bx], al
fcbnzero: ; CODE XREF: close$fcb+2Cj
or al, al
jnz buffnzero
mov al, [bx]
mov di, dx
cld
stosb
buffnzero: ; CODE XREF: close$fcb+32j
cmp al, [bx]
jz dmset
jmps mergerr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
merged: ; CODE XREF: close$fcb+23j
call mergezero
xchg bx, dx
call mergezero
xchg bx, dx
mov si, dx
mov ax, [si]
cmp ax, [bx]
jnz mergerr
inc dx
inc bx
dec cl
dmset: ; CODE XREF: close$fcb+3Cj
inc dx
inc bx
dec cl
jnz merge0
mov bx, dx
sub bx, 14h
push bx
call get$dir$ext ; Compute directory extent from FCB
pop si
mov cl, [si]
mov ch, [bx]
mov [si], al
mov [bx], al
add si, 3
add bx, 3
cmp al, cl
jnz mrg$rc1
cmp al, ch
jnz mrg$rc2
mov al, [si]
cmp al, [bx]
jb mrg$rc1
or al, al
jnz mrg$rc2
call set$rc3
mrg$rc1: ; CODE XREF: close$fcb+76j
; close$fcb+80j
xchg bx, si
mrg$rc2: ; CODE XREF: close$fcb+7Aj
; close$fcb+84j
mov al, [si]
mov [bx], al
call getdptra
add bx, 0Bh
mov al, [bx]
and al, 7Fh
mov [bx], al
call setfwf
mov cl, 1
call scandm$b
jmp seek$copy
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mergerr: ; CODE XREF: close$fcb+3Ej
; close$fcb+50j ...
call setfwf
mov word ptr 2[bx], 0FFFFh
jmp lret$eq$ff
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
close: ; CODE XREF: open$reel+19p
; cpm_rwrand+64p ...
xor ax, ax
mov byte ptr aret, al
call nowrite ; Return true if drive is software R/O
jnz makeret
mov al, user_fcb+0Eh
and al, 80h
jnz makeret
call cp_fcb10_ffff
jz mergerr
call get$dir$ext ; Compute directory extent from FCB
mov cl, al
mov ch, [bx]
push cx
mov [bx], al
call restore$rc
cmp cl, ch
jnb close1
call set$rc
close1: ; CODE XREF: close+25j
call close$fcb
mov bx, offset user_fcb+0Ch
pop cx
mov cl, [bx]
mov [bx], ch
jmp set$rc
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
make: ; CODE XREF: open$reel+4Bp
; cpm_rwrand+9Ep ...
cmp xdcnt, 0FFFFh
jz cpm_make0
call set_dcnt_dblk
cpm_make0: ; CODE XREF: make+5j
push word ptr user_fcb
mov user_fcb, 0E5h
mov cl, 1
call searchi
call searchn ; Search for the next directory element,
; assuming a previous call on search
pop word ptr user_fcb
jnz make01
makeret: ; CODE XREF: close+8j close+Fj
; ...
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
make01: ; CODE XREF: make+1Fj
test make$xfcb, 0FFh
jnz makeret
mov bx, offset user_fcb+0Dh
mov byte ptr [bx], 0
inc bx
mov al, [bx]
push ax
push bx
and byte ptr [bx], 3Fh
inc bx
mov cx, 11h
mov al, 1
make0: ; CODE XREF: make+41j make+4Fj
mov byte ptr [bx], 0
inc bx
loop make0
dec al
jnz make1
call get$dtba
or al, al
mov cx, 0Ah
jz make0
make1: ; CODE XREF: make+45j
call setcdr
mov cl, 0
mov dx, 20h
call copy$dir0
pop bx
pop ax
mov [bx], al
mov result_F0F, 0
call fix$hash
jmp setfwf
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
open$reel: ; CODE XREF: bdos:3D06p cpm_writerec+37p
mov al, user_fcb+0Eh
mov openreel_S2, al
mov bx, offset user_fcb+0Ch
mov al, [bx]
mov cl, al
inc cl
call compext ; Compare extent nos in AL and CL
; Return nonzero if they do not match
jnz open$reel00
jmp open$reel3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$reel00: ; CODE XREF: open$reel+12j
push bx
push cx
call close
pop cx
pop bx
cmp byte ptr aret, 0FFh
jnz open$reel01
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$reel01: ; CODE XREF: open$reel+23j
mov al, 1Fh
and al, cl ; Increment extent
mov [bx], al
jnz open$reel0
add bx, 2
inc byte ptr [bx]
mov al, [bx] ; Increment module
and al, 3Fh
jz open$r$error
open$reel0: ; CODE XREF: open$reel+2Cj
mov xdcnt, 0FFFFh
call search$namlen ; Find a numbered extent
jnz open$reel1
mov al, rmf ; Read mode flag
inc al
jz open$r$error
call make
jz open$r$error
jmps open$reel1a
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$reel1: ; CODE XREF: open$reel+42j
call open$copy
open$reel1a: ; CODE XREF: open$reel+50j
call set$lsn
open$reel2: ; CODE XREF: open$reel+A2j
call getfcb ; Set variables from currently addressed FCB
xor al, al
mov vrecord, al
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$r$error: ; CODE XREF: open$reel+37j
; open$reel+49j ...
mov bx, offset user_fcb+0Ch
mov al, openreel_S2
mov 2[bx], al
mov al, [bx]
dec al
and al, 1Fh
mov [bx], al
mov open_unknown, 0FFh
jmp f_ret_1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$reel3: ; CODE XREF: open$reel+14j
mov [bx], cl
call get$dir$ext ; Compute directory extent from FCB
mov cl, al
test high$ext, 80h
jnz open$reel4
cmp al, [bx]
jnb open$reel4
dec byte ptr [bx]
cmp rmf, 0FFh ; Read mode flag
jnz open$reel3a
jmp f_ret_1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open$reel3a: ; CODE XREF: open$reel+95j
inc byte ptr [bx]
open$reel4: ; CODE XREF: open$reel+88j
; open$reel+8Cj
call restore$rc
call set$rc
jmps open$reel2
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
calc_extent_no: ; CODE XREF: cpm_rwrand+1p
; fat_rdwr+41p
mov al, user_fcb+21h
mov dl, al
and dl, 7Fh
rcl al, 1
mov al, user_fcb+22h
mov ch, al
rcl ch, 1
and ch, 1Fh
and al, 0F0h
or al, user_fcb+23h
mov cl, 4
rol al, cl
mov cl, ch
mov ch, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; CL=-1 read 0 write
cpm_rwrand: ; CODE XREF: F_READRAND+11p
; F_WRITERAND+11p ...
push cx
call calc_extent_no
cmp user_fcb+23h, 3
mov bl, 6
jbe crwr_1
jmp seekerr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
crwr_1: ; CODE XREF: cpm_rwrand+Bj
mov user_fcb+20h, dl
cmp fs_function, 28 ; Write ZF?
jz diskwr11
call cp_fcb10_ffff
jz diskwr11
mov al, ch
sub al, user_fcb+0Eh
and al, 3Fh
jnz diskwr_err
mov al, user_fcb+0Ch
cmp al, cl
jnz fill0
jmp seekok2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fill0: ; CODE XREF: cpm_rwrand+2Fj
call compext ; Compare extent nos in AL and CL
; Return nonzero if they do not match
jnz diskwr_err
push cx
call get$dir$ext ; Compute directory extent from FCB
pop cx
cmp al, cl
jnb fill2
test high$ext, 80h
jnz fill2
pop dx
push dx
inc dl
jnz fill2
inc dl
pop dx
jmp f_ret_1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fill2: ; CODE XREF: cpm_rwrand+40j
; cpm_rwrand+47j ...
mov user_fcb+0Ch, cl
mov cl, al
call restore$rc
call set$rc
jmps seekok2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
diskwr_err: ; CODE XREF: cpm_rwrand+28j
; cpm_rwrand+37j
push cx
call close
pop cx
mov bl, 3
mov al, byte ptr aret
inc al
jz seekerr
diskwr11: ; CODE XREF: cpm_rwrand+19j
; cpm_rwrand+1Ej
mov xdcnt, 0FFFFh
xchg cl, user_fcb+0Ch; CL = EX
mov al, user_fcb+0Eh; AL = S2
xchg ch, al ; CH = S2, CL = EX
push cx
and ch, 40h
or al, ch
mov user_fcb+0Eh, al
call open
mov al, byte ptr aret
inc al
jnz seekok
mov bp, sp
mov cx, 2[bp]
mov bl, 4
inc cl
jz badseek
call make
mov bl, 5
mov al, byte ptr aret
inc al
jz badseek
seekok: ; CODE XREF: cpm_rwrand+91j
pop cx
call set$lsn
seekok2: ; CODE XREF: cpm_rwrand+31j
; cpm_rwrand+61j
pop cx
xor al, al
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
badseek: ; CODE XREF: cpm_rwrand+9Cj
; cpm_rwrand+A8j
pop ax
mov user_fcb+0Ch, al
mov user_fcb+0Eh, ah
seekerr: ; CODE XREF: cpm_rwrand+Dj
; cpm_rwrand+6Fj
pop cx
mov byte ptr aret, bl
or bl, bl
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$nprs: ; CODE XREF: bdos:3D18p cpm_writerec+E4p
mov ch, blk$off ; Is direct transfer operation in
; progress?
mov al, dir$cnt
cmp al, 2
jb check$npr1 ; No.
dec al
mov dir$cnt, al
stc
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
check$npr1: ; CODE XREF: check$nprs+9j
mov al, dpb_phm
mov cl, al
and al, ch
jz check$npr11 ; Are we in mid-physical record?
check$npr1a: ; CODE XREF: check$nprs+2Ej
; check$nprs+35j ...
or cl, cl
jz check$npr1b
xor al, al ; No deblocking required
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
check$npr1b: ; CODE XREF: check$nprs+1Dj
or al, 1 ; Deblocking required
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
check$npr11: ; CODE XREF: check$nprs+19j
mov dh, cl
not dh
mov al, last_sec_count
cmp al, 2
jb check$npr1a
test high$ext, 80h
jnz check$npr1a
cmp fs_function, 16h
jz check$npr1a
mov bx, offset vrecord
mov ah, [bx]
add al, ah
cmp al, 80h
jb check$npr2
mov al, 80h
check$npr2: ; CODE XREF: check$nprs+47j
push cx
mov byte ptr [bx], 7Fh
push bx
push ax
mov bl, al
mov al, dpb_blm
mov dl, al
inc dl
not al
and ah, al
test rmf, 0FFh ; Read mode flag
jz check$npr21
mov al, rcount
and al, dh
cmp al, bl
jb check$npr23
check$npr21: ; CODE XREF: check$nprs+63j
mov al, bl
check$npr23: ; CODE XREF: check$nprs+6Cj
sub al, ah
cmp al, dl
jb check$npr9
push ax
call dm$position
mov ch, al
mov al, dminx
cmp al, ch
mov dl, al
jz check$npr5
mov cl, al
push cx
mov ch, 0
call get$dm ; Get block CX from FCB; returns in BX
check$npr4: ; CODE XREF: check$nprs+96j
; check$nprs+B4j
push bx
inc cx
call get$dm ; Get block CX from FCB; returns in BX
pop dx
inc dx
cmp bx, dx
jz check$npr4
test rmf, 0FFh ; Read mode flag
jnz check$nptr45
or bx, bx
jnz check$nptr45
cmp dx, dpb_dsm
jnb check$nptr45
push cx
push dx
mov cx, dx
call getallocbit
pop bx
pop cx
shr al, 1
jnb check$npr4
check$nptr45: ; CODE XREF: check$nprs+9Dj
; check$nprs+A1j ...
dec cl
pop dx
mov al, dh
cmp al, cl
jb check$npr5
mov al, cl
check$npr5: ; CODE XREF: check$nprs+83j
; check$nprs+BDj
sub al, dl
mov ch, al
inc ch
mov al, dpb_blm
inc al
mul ch
pop cx
xchg al, cl
test rmf, 0FFh ; Read mode flag
jz check$npr8
cmp al, cl
jb check$npr9
check$npr8: ; CODE XREF: check$nprs+D6j
mov al, cl
check$npr9: ; CODE XREF: check$nprs+74j
; check$nprs+DAj
pop cx
pop bx
mov [bx], ch
pop cx
mov dh, last_sec_count
sub al, ch
cmp al, dh
jb check$npr10
mov al, dh
check$npr10: ; CODE XREF: check$nprs+EBj
not cl
and al, cl
jz check$npr10b
mov dir$cnt, al
test rmf, 0FFh ; Read mode flag
jz check$npr10a
push ax
call flushx
pop ax
check$npr10a: ; CODE XREF: check$nprs+FDj
mov cl, dpb_psh
shr al, cl
mov fs_rdwrcount, al
or al, 1
check$npr10b: ; CODE XREF: check$nprs+F3j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_readrec: ; CODE XREF: F_READ+Fj F_READRAND+16j
call tst$inv$fcb
mov al, 0FFh
mov rmf, al ; Read mode flag
call getfcb ; Set variables from currently addressed FCB
mov al, vrecord
cmp al, rcount
jb recordok ; In the current extent
cmp al, 80h
jnz setlret1 ; Already off EOF
call open$reel ; Open the next extent
cmp byte ptr aret, 0
jnz setlret1
recordok: ; CODE XREF: bdos:3D00j
call index ; Compute disk block number from current FCB
jz setlret1
call atran
call check$nprs
jb j_setfcb
jnz read$deblock
jmp go_rdbuff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
read$deblock: ; CODE XREF: bdos:3D1Dj
call setdata
call seek
call rdbuff
j_setfcb: ; CODE XREF: bdos:3D1Bj
jmp setfcb ; Place values back into current FCB
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
setlret1: ; CODE XREF: bdos:3D04j bdos:3D0Ej
; ...
jmp f_ret_1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
setdir1: ; CODE XREF: cpm_writerec+B0p
; fat_make+D9p ...
mov al, dpb_phm
xor ah, ah
inc ax
push ax
mov cl, 6
shl ax, cl
xchg ax, cx
mov di, dph_dirbcb
sub di, 0Ch
setdir1a: ; CODE XREF: setdir1+1Aj
mov di, 12[di]
cmp word ptr 12[di], 0
jnz setdir1a
mov byte ptr [di], 0FFh
mov di, 10[di]
mov word ptr fs_buffer+2, di
mov word ptr fs_buffer, ds
xor ax, ax
rep stosw
pop ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cpm_writerec: ; CODE XREF: F_WRITE+Fj F_WRITERAND+16j
; ...
mov rmf, 0 ; Read mode flag
call check$write
mov al, user_fcb+0Eh
rcl al, 1
not al
test xfcb_rdonly, al
mov ah, 3 ; File R/O
jz writeseq_1
writeseq_err: ; CODE XREF: cpm_writerec+1Fj
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
writeseq_1: ; CODE XREF: cpm_writerec+15j
test high$ext, 40h ; In R/O mode?
jnz writeseq_err
mov bx, offset user_fcb
call check$rofile
call tst$inv$fcb
call update$stamp
call getfcb ; Set variables from currently addressed FCB
mov al, vrecord
cmp al, 80h
jb dskwrite0
call open$reel
test byte ptr aret, 0FFh
jz dskwrite0
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dskwrite0: ; CODE XREF: cpm_writerec+35j
; cpm_writerec+3Fj
call index ; Compute disk block number from current FCB
jz dskwrite2
mov cl, 0 ; Marked as normal write operation
; for wrbuff
jmps diskwr1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dskwrite2: ; CODE XREF: cpm_writerec+45j
call dm$position
mov dminx, al
xor cx, cx ; May use block zero
or al, al
jz nopblock ; Skip if no prev block
mov cl, al
dec cx
call get$dm ; Get block CX from FCB; returns in BX
mov cx, bx
nopblock: ; CODE XREF: cpm_writerec+55j
call get$block
or bx, bx ; Can't find a block?
jnz blockok
mov al, 2 ; Disk full
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
blockok: ; CODE XREF: cpm_writerec+64j
mov bcb_record, bx
mov dx, bx
call lru_touch ; Take the last LRU buffer, move to head of chain,
; allocate to drive bcb_drive block DX
mov bx, offset user_fcb+10h
cmp single, 0 ; Nonzero if using 8-bit blocks
mov al, dminx
mov ah, 0
jz allocwd
add bx, ax
mov [bx], dl
jmps diskwru
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
allocwd: ; CODE XREF: cpm_writerec+81j
add bx, ax
add bx, ax
mov [bx], dx
inc bx
diskwru: ; CODE XREF: cpm_writerec+87j
mov cl, 2 ; Write to previously unallocated block
diskwr1: ; CODE XREF: cpm_writerec+49j
mov deblock_flag, cl
call atran
cmp fs_function, 16h; Write random with ZF?
jnz dskwr11
cmp deblock_flag, 2
jnz dskwr11
mov deblock_flag, 0
push bcb_record
call setdir1
push ax
mov cl, dpb_blm
call lru_ckdirty ; Returns Carry set if buffer dirty?
mov ax, bcb_dirty
mov cl, 2
fill1: ; CODE XREF: cpm_writerec+DDj
mov bcb_record, ax
push cx
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
call seek
pop cx
call wrbuff
mov ax, bcb_record ; Restore record
pop bx
push bx
add ax, bx ; Continue until (blkmsk & arecord) = 0
mov bl, dpb_blm
and bl, al
mov cl, 0
jnz fill1
pop bx
pop bcb_record
dskwr11: ; CODE XREF: cpm_writerec+9Ej
; cpm_writerec+A5j
call check$nprs
jb dont$write
jnz _write
mov ah, 2
call deblock$dta
jmps dont$write1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
_write: ; CODE XREF: cpm_writerec+E9j
call setdata
call seek
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
mov cl, blk$off
if PCPM204E
call lru_free ; Free all LRU buffers for drive bcb_drive
else
call lru_ckdirty
endif
mov cl, deblock_flag
cmp blk$off, 0
jz write00
mov cl, 0
write00: ; CODE XREF: cpm_writerec+10Bj
call wrbuff
jmps dont$write1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dont$write: ; CODE XREF: cpm_writerec+E7j
if DONTWRITE_PATCH
jmp patch_dontwrite
else
call discard$databcb
endif
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dont$write1: ; CODE XREF: cpm_writerec+F0j
; cpm_writerec+112j ...
mov al, vrecord
mov bx, offset rcount
cmp al, [bx]
jb diskwr2
mov [bx], al
inc byte ptr [bx] ; rcount = vrecord + 1
mov deblock_flag, 2 ; Mark as record count incremented
diskwr2: ; CODE XREF: cpm_writerec+11Fj
cmp deblock_flag, 2
jnz noupdate
and user_fcb+0Eh, 7Fh; Reset FWF
noupdate: ; CODE XREF: cpm_writerec+12Fj
call getmodnum
and al, 40h
jnz diskwrite3
or byte ptr [bx], 40h; Set file write flag
and user_fcb+0Eh, 7Fh
diskwrite3: ; CODE XREF: cpm_writerec+13Bj
jmp setfcb ; Place values back into current FCB
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Convert a size (extent + record no)
; to a 3-byte record number.
extent_size: ; CODE XREF: F_SIZE+1Fp F_RANDREC+6p
; ...
xchg bx, dx
add bx, dx
mov cl, [bx]
xor ch, ch
mov bx, dx
mov ah, 12[bx]
shr ax, 1
and ax, 0F80h
add cx, ax
mov al, 14[bx]
and al, 3Fh
mov ah, 10h
mul ah
add ch, al
mov al, 0
adc al, ah
login_fail: ; CODE XREF: compare_recno+6j
; drive_login+Bj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
compare_recno: ; CODE XREF: F_SIZE+22p F_TRUNCATE+34p
mov bx, offset user_fcb+21h
cmp al, 2[bx]
jnz login_fail
cmp cx, [bx]
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
drive_login: ; CODE XREF: disk$select1+Bp
push dx
mov cl, al
mov al, 9 ; SELDSK
call fs_call_xios
pop dx
or bx, bx
jz login_fail
inc bx
inc bx
mov cdrmaxa, bx
inc bx
inc bx
mov lsn$add, bx
add bx, 4
mov si, bx
mov di, offset dph_dpb
mov cx, 0Ch
rep movsb
mov si, dph_dpb
lodsw
cmp ax, 0FFFEh
jb fs_is_cpm
mov max_cluster, 0FFFFh
jz fs_is_fat16
mov max_cluster, 0FFFh
fs_is_fat16: ; CODE XREF: drive_login+36j
add dph_dpb, 0Ch
mov di, offset dpb_fatcount
mov cx, 1Bh
rep movsb
test dl, 1 ; Logged in before?
jnz fats_loaded
push ax
call load_fats
pop ax
or bx, bx
jz drv_login_ret
fats_loaded: ; CODE XREF: drive_login+4Ej
mov ax, dpb_clustersize
xor dx, dx
mov cx, 32
div cx
dec ax
mov names_per_block, ax
mov al, 1
jmps have_fstype
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fs_is_cpm: ; CODE XREF: drive_login+2Ej
mov di, offset dpb_spt
stosw
mov cx, 0Fh
rep movsb
xor al, al
have_fstype: ; CODE XREF: drive_login+69j
mov F_isfatfs, al
mov al, byte ptr dpb_dsm+1
or al, al
jz fewer256blocks
mov al, 1
fewer256blocks: ; CODE XREF: drive_login+7Ej
dec al
mov single, al ; Nonzero if using 8-bit blocks
stc
drv_login_ret: ; CODE XREF: drive_login+57j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
load_fats: ; CODE XREF: drive_login+51p
mov ax, dpb_firstfat
mov cx, dpb_fatcount
load_fat: ; CODE XREF: load_fats+3Bj
push ax
push cx
xor dx, dx
div dpb_spt
mov fs_track, ax
mov fs_sector, dx
mov al, byte ptr dpb_secperfat
mov fs_rdwrcount, al
mov ax, dph_hash
mov word ptr fs_buffer, ax
mov word ptr fs_buffer+2, 0
mov al, 0Ah ; READ
call xios_rdwr
mov bx, 1
pop cx
pop dx
or al, al
jz lfat_fail
mov ax, dpb_secperfat
add ax, dx
loop load_fat
xor bx, bx
lfat_fail: ; CODE XREF: load_fats+34j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
write_FAT: ; CODE XREF: fat_close+33p
; fat_make+52p ...
mov ax, dpb_firstfat
mov cx, dpb_fatcount
xor bx, bx
write_fat_loop: ; CODE XREF: write_FAT+39j
push ax
push bx
push cx
xor dx, dx
div dpb_spt
mov fs_track, ax
mov fs_sector, dx
mov al, byte ptr dpb_secperfat
mov fs_rdwrcount, al
mov ax, dph_hash
mov word ptr fs_buffer, ax
mov word ptr fs_buffer+2, 0
mov al, 0Bh
call xios_rdwr
pop cx
pop bx
or bx, ax
pop ax
add ax, dpb_secperfat
loop write_fat_loop
mov al, bl
mov ah, 0FFh
jmp diocomp1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
disk$select: ; CODE XREF: curselect+9p reselect+6Cp
mov bcb_drive, al
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
disk$select1: ; CODE XREF: deblock+EFp
mov curdsk, al
mov dx, login_vector
call test$vector ; Return bit curdsk of vector DX
push dx
call drive_login
pop bx
jnb disk$select1a
dec bl
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
disk$select1a: ; CODE XREF: disk$select1+Fj
jmp j_fs_abort4
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
tmpselect_dir: ; CODE XREF: DRV_SETp DRV_RESET+18p
; ...
mov fs_fcbdrive, dl
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
curselect_dir: ; CODE XREF: reselect+3Dp F_SFIRST+16p
; ...
mov al, fs_fcbdrive
cmp al, 0FFh
jnz curselect_dir1
inc al
jz j_fs_abort4
noselect: ; CODE XREF: curselect+7j curselect+Cj
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
curselect_dir1: ; CODE XREF: curselect_dir+5j
mov chdir_drive, al
mov cur_drvdir, 0
cmp al, 10h
jnb j_fs_abort4
mov cl, 0
call cwd_for_drive
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
curselect: ; CODE XREF: tst$relog+Ap drv$relogp
; ...
mov al, fs_fcbdrive
curselect0: ; CODE XREF: cwd_for_drive+1Cj
cmp al, curdsk
jz noselect
call disk$select
jz noselect
cmp F_isfatfs, 0
jnz curselect01
call cpm_login
jmps curselect02
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
curselect01: ; CODE XREF: curselect+13j
call fat_login
curselect02: ; CODE XREF: curselect+18j
mov bx, lsn$add
mov al, 2[bx]
and al, 1
add 2[bx], al
mov bx, offset login_vector
call set$cdisk
cmp dpb_cks, 8000h
jz curselect03
mov bx, offset removable_drive
call set$cdisk
curselect03: ; CODE XREF: curselect+35j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cwd_for_drive: ; CODE XREF: ret_drv_vector+11p
; curselect_dir+1Bp ...
push ds
mov ds, rlr
mov bx, proc_dirname
pop ds
or bx, bx
jz no_cwd_found
xor ah, ah
mov si, ax
add si, si ; +2*drive
mov bx, [bx+si] ; Have CWD on this drive?
or bx, bx
jnz cwd_found
no_cwd_found: ; CODE XREF: cwd_for_drive+Cj
cmp al, 0Dh ; Floating drive?
jb curselect0
mov al, sysvar_144
cmp cl, 0FFh
jz cwdfd_ret
mov fs_fcbdrive, al
jmps cwdfd_ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_fs_abort4: ; CODE XREF: disk$select1+14j
; curselect_dir+9j ...
jmp sel$error ; Report select error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cwd_found: ; CODE XREF: cwd_for_drive+18j
mov al, [bx] ; Drive this CWD structure applies to
cmp cl, 0FFh
jz cwdfd_ret
mov cur_drvdir, bx
mov fs_fcbdrive, al
mov dname_cluster, 0
cwdfd_ret: ; CODE XREF: cwd_for_drive+24j
; cwd_for_drive+29j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
sel1_fcb_drive: ; CODE XREF: F_SFIRST+20p F_MAKE+Bp
; ...
xor al, al
mov high$ext, al
mov xfcb_rdonly, al
jmps sel_fcb_drive
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
reselect: ; CODE XREF: F_do_call+24p
mov cx, 807Fh
mov bx, offset user_fcb+7
mov al, [bx]
and al, ch
mov xfcb_rdonly, al
and [bx], cl
inc bx
mov al, [bx]
and al, cl
cmp al, [bx]
mov [bx], al
mov al, 60h ; If F8' was set, assume top 3 bits
; of EX are 011
jnz got_exflags
mov al, 4[bx]
and al, 0E0h ; Top 3 bits of EX
got_exflags: ; CODE XREF: reselect+1Aj
mov high$ext, al
call clr$ext
sel_fcb_drive: ; CODE XREF: sel1_fcb_drive+8j
mov set_if_attrs, 0FFh
mov al, user_fcb
mov fcbdsk, al
and al, 1Fh
dec al
cmp al, 0FFh
jz _noselect
mov fs_fcbdrive, al
_noselect: ; CODE XREF: reselect+38j
call curselect_dir
mov al, usrcode
mov user_fcb, al
noselect0: ; CODE XREF: F_SFIRST+19p
call tst$log$fxs
jnz dont_discard
mov dir_check_flag, 0F0h
dont_discard: ; CODE XREF: reselect+49j
call check$media
xor al, al
xchg al, xios_bh_gdopen
test al, al
jnz check_all_media
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
check_all_media: ; CODE XREF: reselect+5Bj
mov bx, login_vector
mov al, 10h
chk$am1: ; CODE XREF: reselect+92j
dec al
shl bx, 1
jnb chk$am2
push ax
push bx
call disk$select
mov bx, dph_dtabcb
mov bx, [bx]
reselect2: ; CODE XREF: reselect+89j
or bx, bx
jz reselect5
mov al, bcb_drive
cmp al, [bx]
jnz reselect3
test byte ptr 4[bx], 0FFh
jnz reselect4
reselect3: ; CODE XREF: reselect+7Ej
mov bx, 12[bx]
jmps reselect2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
reselect4: ; CODE XREF: reselect+84j
call check$media
reselect5: ; CODE XREF: reselect+77j
pop bx
pop ax
chk$am2: ; CODE XREF: reselect+68j
or al, al
jnz chk$am1
jmp curselect
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
check$media: ; CODE XREF: reselect+50p reselect+8Bp
; ...
mov bx, lsn$add
xor al, al
xchg al, 1[bx]
or al, al
jz no_media_flag
call discard$dir ; Release all directory BCBs for a drive
push dcnt
call set$end$dir
check$media1: ; CODE XREF: check$media+43j
mov cl, 0
call r$dir
xor al, al
xchg al, relog
test al, al
jz check$media2
cmp fs_function, 1Ah
jz check$media$end
mov al, bcb_drive
cmp al, fs_fcbdrive
jnz check$media$end
pop dcnt
call drv$relog
jmp chk$exit$fxs
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
check$media2: ; CODE XREF: check$media+24j
call compcdr
jb check$media1
check$media$end: ; CODE XREF: check$media+2Bj
; check$media+34j
pop dcnt
no_media_flag: ; CODE XREF: check$media+Bj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copy8fromdma: ; CODE XREF: F_OPENp F_DELETEp
; ...
mov cl, 8
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
copyfromdma: ; CODE XREF: F_MAKE+2p DRV_SETLABEL+2p
; ...
mov si, userdma
mov di, offset passwd_buf
push ds
mov ds, userdmaseg
xor ch, ch
rep movsb
pop ds
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$dir$mode: ; CODE XREF: cpm_delete+20p
; cpm_delete+31p ...
mov bx, lsn$add
mov al, [bx]
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$xfcb: ; CODE XREF: chk$pw$error+46p
; chk$pw$error+75p ...
mov bx, offset user_fcb
mov al, [bx]
push ax
or byte ptr [bx], 10h
call search$extnum ; Find any extent of a file
pop ax
mov user_fcb, al
mov byte ptr aret, 0
jnz get$xfcb1
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$xfcb1: ; CODE XREF: get$xfcb+15j chk_xfcb_passwdp
; ...
call getdptra
mov dx, bx
add bx, 0Ch
mov al, [bx]
and al, 0E0h
or al, 1
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
init$xfcb: ; CODE XREF: F_MAKE+B1p DRV_SETLABEL+46p
; ...
call setcdr
mov cx, 1014h
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
init$xfcb0: ; CODE XREF: DRV_SETLABEL+65p
push cx
call getdptra
mov si, offset user_fcb
lodsb
or al, ch
mov [bx], al
inc bx
mov cl, 0Bh
mov dx, si
call move ; Copy CL bytes from DX to BX
mov dx, si
mov bx, di
pop cx
sub ch, ch
xor al, al
rep stosb
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chk$pw$error: ; CODE XREF: cpm_delete+3Dp
; openx+71p ...
mov byte ptr xdcnt+1, 0; Disable special searches
mov si, offset user_fcb
mov di, offset passwd_fcb
mov cx, 10h
rep movsb
call getdptra ; Find XFCB with ext=0 S2=0
mov si, bx
inc si
mov di, offset user_fcb+1
mov cx, 0Bh ; Copy name.type
rep movsb
xor al, al
stosb ; Blank EX
inc di
stosb ; Blank S2
lodsb ; Password mode
mov pw$mode, al ; Password mode
call search$namlen ; Find a numbered extent
jz chk$pwe2
call get$dtba$8 ; Does SFCB exist for FCB?
or al, al
jnz chk$pwe1
mov si, offset pw$mode; Password mode
mov ch, [si]
mov al, [bx]
mov [si], al
or al, al ; Is SFCB password mode nonzero?
jz chk$pwe2 ; No
xor al, ch ; Does XFCB mode match SFCB?
and al, 0E0h
jz chk$pwe1
call get$xfcb ; Update XFCB to match SFCB
jz chk$pwe1
mov al, pw$mode ; Password mode
mov [bx], al
call nowrite ; Return true if drive is software R/O
jnz chk$pwe1
call seek$copy
chk$pwe1: ; CODE XREF: chk$pw$error+31j
; chk$pw$error+44j ...
call restore$pw$fcb
mov al, fs_function
cmp al, 2 ; F_OPEN
jz chk_pwe_ret
cmp al, 9 ; F_MAKE
jz chk_pwe_ret
pw$error: ; CODE XREF: openx+7Fj F_MAKE+6Ej
; ...
mov ah, 7
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
chk$pwe2: ; CODE XREF: chk$pw$error+2Aj
; chk$pw$error+3Ej
mov pw$mode, 0 ; Password mode
call nowrite ; Return true if drive is software R/O
jnz restore$pw$fcb
call get$xfcb ; Delete XFCB
jz restore$pw$fcb
or user_fcb, 10h
call delete11
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
restore$pw$fcb: ; CODE XREF: chk$pw$error+58p
; chk$pw$error+73j ...
mov si, offset passwd_fcb
mov di, offset user_fcb
mov cx, 10h
rep movsb
chk_pwe_ret: ; CODE XREF: chk$pw$error+60j
; chk$pw$error+64j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chk$password: ; CODE XREF: bdos:479Dp F_ATTRIB+13p
; ...
call get$dir$mode
and al, 80h
jz chk_pwe_ret
call get$xfcb
jz chk_pwe_ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Compare password
cmp$pw: ; CODE XREF: chk_xfcb_passwd+4p
; openx+6Cp
inc bx
mov ch, [bx]
or ch, ch
jnz cmp$pw2
mov si, bx
add si, 3
mov cl, 9
cmp$pw1: ; CODE XREF: cmp$pw+15j cmp$pw+19j
lodsb
dec cl
jz chk_pwe_ret
or al, al
jz cmp$pw1
cmp al, 20h
jz cmp$pw1
cmp$pw2: ; CODE XREF: cmp$pw+5j
lea si, 10[bx]
lea dx, 3[bx]
mov bx, offset passwd_buf
mov cl, 8
std
cmp$pw3: ; CODE XREF: cmp$pw+31j
lodsb
xor al, ch
cmp al, [bx]
jnz cmp$pw5
inc bx
dec cl
jnz cmp$pw3
cld
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cmp$pw5: ; CODE XREF: cmp$pw+2Cj
cld
mov bx, offset df$password; Default password
mov cl, 8
jmp compare ; Compare CL bytes at DX and BX
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
chk_xfcb_passwd: ; CODE XREF: cpm_delete+38p
; DRV_SETLABEL+5Bp ...
call get$xfcb1
chk_xfcb_passw1: ; CODE XREF: F_MAKE+5Fp
push bx
call cmp$pw ; Compare password
pop bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set$pw: ; CODE XREF: F_MAKE+CEp sdl2+9p
mov cx, 8
lea di, 11[bx]
set$pw0: ; CODE XREF: F_PASSWD+15j
sub ah, ah
set$pw1: ; CODE XREF: set$pw+1Aj
lodsb
mov [di], al
or al, al
jz set$pw2
cmp al, 20h
jz set$pw2
inc ah
set$pw2: ; CODE XREF: set$pw+Dj set$pw+11j
add ch, al
dec di
dec cl
jnz set$pw1
or ah, ch
jnz set$pw3
mov [bx], ah
set$pw3: ; CODE XREF: set$pw+1Ej
inc di
mov cl, 8
set$pw4: ; CODE XREF: set$pw+2Aj
xor [di], ch
inc di
dec cl
jnz set$pw4
mov 1[bx], ch
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get$dtba$8: ; CODE XREF: delete11+14p chk$pw$error+2Cp
; ...
mov ch, 8
get$dtba: ; CODE XREF: make+47p stamp2+2p
; ...
mov al, 3
mov ah, byte ptr dcnt
and ah, 3
cmp al, ah
jz get$dtba$ret
mov bx, buffa
add bx, 60h
mov al, [bx]
sub al, 21h
jnz get$dtba$ret
mov al, ah
mov cl, 0Ah
mul cl
inc al
add al, ch
add bx, ax
xor al, al
get$dtba$ret: ; CODE XREF: get$dtba$8+Dj
; get$dtba$8+1Aj ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
qdirfcb1: ; CODE XREF: qstampp openx+31p
; ...
mov bx, offset user_fcb+0Ch
mov al, [bx]
mov ah, dpb_exm
not ah
and al, ah
and al, 1Fh
jnz get$dtba$ret
test byte ptr 2[bx], 3Fh
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
qstamp: ; CODE XREF: openx2p F_MAKE+EFp
; ...
call qdirfcb1
jnz get$dtba$ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
qstamp1: ; CODE XREF: update$stamp+2p
call get$dir$mode
and al, cl
jz qstamp1a
jmp nowrite ; Return true if drive is software R/O
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
qstamp1a: ; CODE XREF: qstamp1+5j
inc al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
stamp1: ; CODE XREF: openx2+5j DRV_SETLABEL+4Fp
mov ch, 0
jmps stamp3
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
stamp2: ; CODE XREF: update$stamp+1Bp
; F_MAKE+F4p ...
mov ch, 4
stamp3: ; CODE XREF: stamp1+2j
call get$dtba
or al, al
jnz get$dtba$ret
stamp_cmpdate: ; CODE XREF: stamp5+9j
mov dx, offset date_days
stamp_compare: ; CODE XREF: F_BDOS_74+3Bp
; F_BDOS_74+51p
mov cl, 4
push bx
push dx
call compare ; Compare CL bytes at DX and BX
pop dx
pop bx
jz get$dtba$ret
mov cl, 4
call move ; Copy CL bytes from DX to BX
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
stamp5: ; CODE XREF: DRV_SETLABEL+4Cp
; DRV_SETLABEL+55p
call getdptra
add bx, cx
mov ax, offset F_nop
push ax
jmps stamp_cmpdate
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
update$stamp: ; CODE XREF: cpm_writerec+2Ap
; F_TRUNCATE+8Ap
mov cl, 20h ; Is update stamping requested?
call qstamp1
jnz get$dtba$ret
test user_fcb+0Eh, 40h; Has file been written to?
jnz get$dtba$ret
mov ah, user_fcb+0Ch; Save EX and S2
mov al, user_fcb+0Eh
push ax
call find_extent_0 ; Find the SFCB
jz no_stamp2
call stamp2
no_stamp2: ; CODE XREF: update$stamp+19j
mov byte ptr aret, 0
pop ax
mov user_fcb+0Ch, ah
mov user_fcb+0Eh, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
dirdata_alloc: ; CODE XREF: cpm_opendir+E5p
cli
mov bx, free_dirdata
or bx, bx
jz dda_allgone
mov si, [bx]
mov free_dirdata, si
dda_allgone: ; CODE XREF: dirdata_alloc+7j
sti
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
intrnldiskreset: ; CODE XREF: DRV_SETRO+9p
mov dx, bx
mov cx, 3
dskrst0: ; CODE XREF: intrnldiskreset+1Fj
shl bx, 1
jnb dskrst1
push cx
push bx
mov al, cl
add al, 0Ch
mov cl, 0FFh
call cwd_for_drive
mov cl, al
mov ax, 1
shl ax, cl
or dx, ax
pop bx
pop cx
dskrst1: ; CODE XREF: intrnldiskreset+7j
loop dskrst0
and dx, 1FFFh
mov bx, dx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Return bitmap of all drives in use by processes
get_drvs_in_use: ; CODE XREF: not_drv_loggedp
; DRV_RESETp
xor ax, ax
push es
mov es, bdos_conowner
gdiu_0: ; CODE XREF: get_drvs_in_use+1Dj
cmp es:proc_status, 2; 0 => Runnable
; 1 => waiting on timer
; 2 => terminated
; 3 => waiting on flag
jz gdiu_1
or ax, es:proc_using_drvs
gdiu_1: ; CODE XREF: get_drvs_in_use+Dj
mov cx, es:proc_nextseg
mov es, cx
or cx, cx
jnz gdiu_0
pop es
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
not_drv_logged: ; CODE XREF: DRV_FLUSH+2Cp
; DRV_FLUSH+63p
call get_drvs_in_use ; Return bitmap of all drives in use by processes
not ax
mov dx, ax
jmp test$vector ; Return bit curdsk of vector DX
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
call end$of$dir
mov cl, 0
jmp read$dir
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_ALLRESET: ; DATA XREF: bdos:256Eo
mov ax, 0FFFFh
mov fs_param_low, ax
call DRV_RESET
xor al, al ; A: is the default
call set_proc_drive
dec al ; But no drive is logged in
mov curdsk, al
push ds
mov ds, rlr
mov word ptr proc_dma, 80h
pop ds
jmp DRV_FLUSH
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_SET: ; DATA XREF: bdos:2571o
call tmpselect_dir
mov al, linfo
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set_proc_drive: ; CODE XREF: DRV_ALLRESET+Bp
push ds
mov ds, rlr
mov proc_drive, al
pop ds
spd_ret: ; CODE XREF: F_OPEN+20j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_OPEN: ; DATA XREF: bdos:2574o
call copy8fromdma ; Get password
call clrmodnum ; Clear S2 byte of FCB
cmp F_isfatfs, 0
jz cpm_open
jmp fat_open
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_open: ; CODE XREF: F_OPEN+Bj
test fcb_is_for_dir, 0FFh
jz cpm_openfile
call cpm_opendir
cmp aret, 0FFh
jnz spd_ret
mov aret, 0FFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_openfile: ; CODE XREF: F_OPEN+15j
call check$wild
cmp usrcode, 0
jz call$open
mov al, 0FEh
mov byte ptr xdcnt+1, al
inc al
mov search$user0, al
call$open: ; CODE XREF: F_OPEN+31j
call open
call openx
xor al, al
xchg al, search$user0
test al, al
jnz callopen_noret
callopen_ret: ; CODE XREF: F_OPEN+53j openx+3j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
callopen_noret: ; CODE XREF: F_OPEN+4Bj
cmp byte ptr xdcnt+1, 0FEh
jz callopen_ret
call set_dcnt_dblk
mov high$ext, 60h
xor al, al ; Try to open in user 0
mov user_fcb, al
mov cl, 0Fh
call searchi
call searchn ; Search for the next directory element,
; assuming a previous call on search
call open1
call openx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
openx: ; CODE XREF: F_OPEN+40p F_OPEN+6Dp
call end$of$dir
jz callopen_ret
mov bx, offset user_fcb+20h
cmp byte ptr [bx], 0FFh
jnz openxa
mov al, user_fcb+0Dh
mov [bx], al
openxa: ; CODE XREF: openx+Bj
pop bx ; Open successful. Discard return address
mov al, high$ext
cmp al, 60h
jnz openx0
mov al, user_fcb+0Ah; System file?
and al, 80h
jnz openx0 ; Yes - open successful
mov high$ext, al
jmp lret$eq$ff ; Open fails
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
openx0: ; CODE XREF: openx+18j openx+1Fj
call set$lsn
call get$dir$mode ; Are passwords enabled on drive?
test al, 80h
jz openx1a
call qdirfcb1 ; Is this the first dir fcb?
jnz openx0a
call get$dtba$8 ; Does SFCB exist?
or al, al
jnz openx0a
test byte ptr [bx], 0C0h; Password read/write?
jz openx1a
call xdcnt_eq_dcnt ; Does XFCB exist?
call get$xfcb
jnz openx0b
call restore_dir_fcb
jz openxret
call get$dtba
or al, al
jnz openx1a
mov [bx], al
call nowrite ; Return true if drive is software R/O
jnz openx1a
call seek$copy
jmps openx1a
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
openx0a: ; CODE XREF: openx+34j openx+3Bj
call xdcnt_eq_dcnt
call get$xfcb
and al, 0C0h
jz openx1
openx0b: ; CODE XREF: openx+48j
call cmp$pw ; Compare password
jz openx1
call chk$pw$error
mov al, pw$mode ; Password mode
and al, 0C0h
jz openx1
test al, 80h
jz openx0c
jmp pw$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
openx0c: ; CODE XREF: openx+7Dj
mov xfcb_rdonly, 80h; Can only open read-only
openx1: ; CODE XREF: openx+6Aj openx+6Fj
; ...
call restore_dir_fcb
jnz openx1a
openxret: ; CODE XREF: openx+4Dj
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
openx1a: ; CODE XREF: openx+2Fj openx+40j
; ...
call set$lsn
mov open_unknown, 0FFh
mov cl, 40h
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
openx2: ; CODE XREF: F_MAKE+EAp
call qstamp
jnz openx2_ret
jmp stamp1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_CLOSE: ; DATA XREF: bdos:2577o
cmp F_isfatfs, 0
jz close_file
test fcb_is_for_dir, 0FFh
jz close_file
jmp fat_close
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
close_file: ; CODE XREF: F_CLOSE+5j F_CLOSE+Cj
cmp F_isfatfs, 0
jz cpm_close
jmp fat_close
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_close: ; CODE XREF: F_CLOSE+16j
test fcb_is_for_dir, 0FFh
jz cpm_closefile
mov aret, 0
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_closefile: ; CODE XREF: F_CLOSE+20j
call set$lsn
call chek$fcb
call close
cmp byte ptr aret, 0FFh
jnz f_close_flush
openx2_ret: ; CODE XREF: openx2+3j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_close_flush: ; CODE XREF: F_CLOSE+37j
call call_xios_flush
f_close_end: ; CODE XREF: fat_close+50j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_SFIRST: ; DATA XREF: bdos:257Ao
mov ax, fs_param_ds
mov word ptr sys_find1st+2, ax
mov ax, fs_param_low
mov word ptr sys_find1st, ax
xor al, al
csearch: ; CODE XREF: bdos:464Aj
pushf
cmp user_fcb, '?' ; If drive byte is '?', search
; the default drive.
jnz csearch1
call curselect_dir
call noselect0
xor cl, cl
jmps csearch3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
csearch1: ; CODE XREF: F_SFIRST+14j
call sel1_fcb_drive
mov cl, 0Ch
mov bx, offset user_fcb+0Ch
cmp byte ptr [bx], 3Fh
jz csearch3
call clr$ext
call clrmodnum ; Clear S2 byte of FCB
mov cl, 0Fh
csearch3: ; CODE XREF: F_SFIRST+1Ej F_SFIRST+2Bj
or dir_check_flag, 0Fh
cmp F_isfatfs, 0
jz srch_cpm
jmp srch_fat
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_cpm: ; CODE XREF: F_SFIRST+3Fj
push cs
call f_interrupt
jnz srch_1
call search
jmps srch_found
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_1: ; CODE XREF: F_SFIRST+48j
mov cl, searchl
call searchi
call searchn ; Search for the next directory element,
; assuming a previous call on search
srch_found: ; CODE XREF: F_SFIRST+4Dj
cmp byte ptr aret, 0FFh
jz srch_ret
mov ax, dcnt
and al, 3
mov byte ptr aret, al
mov dx, buffa
mov bx, userdma
mov cl, 80h
push es
mov es, userdmaseg
call move ; Copy CL bytes from DX to BX
pop es
srch_ret: ; CODE XREF: F_SFIRST+5Ej bdos:4620j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
F_SNEXT: ; DATA XREF: bdos:257Do
mov ax, word ptr sys_find1st+2
or ax, word ptr sys_find1st
jz srch_ret
mov ax, word ptr sys_find1st+2
mov fs_param_ds, ax
mov ax, word ptr sys_find1st
mov fs_param_low, ax
call copy_fcb_33
mov searcha, offset user_fcb
test user_fcb, 80h
jz f_snext_file
and user_fcb, 3Fh
mov fcb_is_for_dir, 0FFh
f_snext_file: ; CODE XREF: bdos:463Cj
or al, 1
jmp csearch
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_DELETE: ; DATA XREF: bdos:2580o
call copy8fromdma
cmp F_isfatfs, 0
jz nonfat_delete
jmp fat_delete
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
nonfat_delete: ; CODE XREF: F_DELETE+8j
test fcb_is_for_dir, 0FFh
jz j_cpm_delete
mov aret, 0FFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_cpm_delete: ; CODE XREF: F_DELETE+12j
jmp cpm_delete
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_READ: ; DATA XREF: bdos:2583o
call check_changed
cmp F_isfatfs, 0
jz j_cpm_readrec
mov cl, 1
jmp fat_rdwr ; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_cpm_readrec: ; CODE XREF: F_READ+8j
jmp cpm_readrec
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_WRITE: ; DATA XREF: bdos:2586o
call check_changed
cmp F_isfatfs, 0
jz j_cpm_writerec
mov cl, 0
jmp fat_rdwr ; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_cpm_writerec: ; CODE XREF: F_WRITE+8j
jmp cpm_writerec
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_MAKE: ; DATA XREF: bdos:2589o
mov cl, 9
call copyfromdma ; New password & mode
call clr$ext
call clrmodnum ; Clear S2 byte of FCB
call sel1_fcb_drive
mov dl, 1
call valid_dl_f_fcb
mov xdcnt, 0FFFFh
cmp F_isfatfs, 0
jz cpm_make
jmp fat_make
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_make: ; CODE XREF: F_MAKE+1Ej
test fcb_is_for_dir, 0FFh
jz cpm_makefile
mov aret, 0FFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_makefile: ; CODE XREF: F_MAKE+28j
call get$atts
call open
call end$of$dir
jz makea0
call get$dir$ext ; Compute directory extent from FCB
cmp al, [bx]
jb makea0
mov ah, 8
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
makea0: ; CODE XREF: F_MAKE+3Aj F_MAKE+41j
pushf
call f_make_nop
call qdirfcb1
jz makex04
call get$dir$mode
and al, 80h
jz makex04
call get$xfcb
and al, 0C0h
jz makex04
call chk_xfcb_passw1
jz makex04
call chk$pw$error
test pw$mode, 0C0h ; Password mode
jz makex04
jmp pw$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
makex04: ; CODE XREF: F_MAKE+4Fj F_MAKE+56j
; ...
push cs
call f_interrupt
jb makex05
call make
makex05: ; CODE XREF: F_MAKE+75j
call end$of$dir
jnz makex06
f_make_ret: ; CODE XREF: F_MAKE+D7j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
makex06: ; CODE XREF: F_MAKE+7Dj
call set$lsn
call get$dir$mode
test al, 80h
jz make3a
test attributes, 40h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jz make3a
call qdirfcb1
jnz make3a
call xdcnt_eq_dcnt
call get$xfcb
jnz make00
mov make$xfcb, 0FFh
call make
jnz make00
call search$namlen ; Find a numbered extent
call delete10
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
make00: ; CODE XREF: F_MAKE+9Cj F_MAKE+A6j
call init$xfcb
mov si, offset passwd_buf
add si, 8
lodsb
and al, 0E0h
jnz make2
mov al, 80h
make2: ; CODE XREF: F_MAKE+BDj
mov pw$mode, al ; Password mode
push ax
call get$xfcb1
pop ax
mov [bx], al
mov si, offset passwd_buf
call set$pw
call sdl3
call restore_dir_fcb
jz f_make_ret
call get$dtba$8
or al, al
jnz make3a
mov al, pw$mode ; Password mode
mov [bx], al
call seek$copy
make3a: ; CODE XREF: F_MAKE+88j F_MAKE+8Fj
; ...
mov cl, 50h
call openx2
mov cl, 20h
call qstamp
jnz f_make_ret2
call stamp2
or user_fcb+0Eh, 40h
f_make_ret2: ; CODE XREF: F_MAKE+F2j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_make_nop: ; CODE XREF: F_MAKE+49p
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
F_RENAME: ; DATA XREF: bdos:258Co
call copy8fromdma
call check$wild
cmp F_isfatfs, 0
jz cpm_rename
jmp fat_rename
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_rename: ; CODE XREF: bdos:4798j
call chk$password
jz cpm_rename1
call chk$pw$error
cpm_rename1: ; CODE XREF: bdos:47A0j
call init_xfcb_srch
call copy$user$no
mov searcha, bx
mov dl, 1
call check$wild0
mov ah, 9
jz ren_wildcarderr
mov cl, 0Ch
call searchi1
call search1
jz cpm_rename2
mov ah, 8 ; File exists
ren_wildcarderr: ; CODE XREF: bdos:47B6j
mov cur_fcb_len, 0
add fs_param_low, 10h
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_rename2: ; CODE XREF: bdos:47C0j
call does$xfcb$exist
jz cpm_rename3 ; If XFCB exists for new name, delete it
call delete11
cpm_rename3: ; CODE XREF: bdos:47D4j
call copy$user$no
call init_xfcb_srch
call search$extnum ; Find any extent of a file
jnz cpm_rename4
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_rename4: ; CODE XREF: bdos:47E2j
call check$rodir
rename0: ; CODE XREF: bdos:47F5j bdos:4802j
mov cl, 10h ; Not end of dir, rename next element
mov dl, 0Ch
call copy$dir ; Copy FCB information starting at CL for DL bytes
; into the currently addressed directory entry
call fix$hash
call searchn ; Search for the next directory element,
; assuming a previous call on search
jnz rename0
call does$xfcb$exist
jnz cpm_rename_5
jmp copy$dir$loc
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_rename_5: ; CODE XREF: bdos:47FAj
call copy$user$no
jmps rename0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_ALLOCVEC: ; DATA XREF: bdos:258Fo
call curselect_dir
mov f_ret_es, ds
mov bx, dph_alv
jmps f_ret_bx
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_SETRO: ; DATA XREF: bdos:2592o
mov cl, fs_fcbdrive
mov bx, 1
shl bx, cl
call intrnldiskreset
or readonly_vector, bx
mov dx, dpb_drm
inc dx
mov bx, cdrmaxa
mov [bx], dx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_ATTRIB: ; DATA XREF: bdos:2595o
call copy8fromdma
call check$wild
call sel1_fcb_drive
cmp F_isfatfs, 0
jz f_attrib_cpm
jmp f_attrib_fat
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_cpm: ; CODE XREF: F_ATTRIB+Ej
call chk$password
jz f_attrib_cpm1
call chk$pw$error
f_attrib_cpm1: ; CODE XREF: F_ATTRIB+16j
call get$atts
call search$extnum ; Find any extent of a file
jz rdrand_ret
f_attrib_cpm2: ; CODE XREF: F_ATTRIB+40j
mov cl, 0
mov dl, 0Ch
call copy$dir2
call move ; Copy CL bytes from DX to BX
test attributes, 40h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jz no_bytesize
mov al, user_fcb+20h
mov 13[bx], al
no_bytesize: ; CODE XREF: F_ATTRIB+32j
call seek$copy
call searchn ; Search for the next directory element,
; assuming a previous call on search
jnz f_attrib_cpm2
jmp copy$dir$loc
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DRV_DPB: ; DATA XREF: bdos:2598o
call curselect_dir
mov dir_check_flag, 0F0h
call check$media
mov f_ret_es, ds
mov bx, dph_dpb
f_ret_bx: ; CODE XREF: DRV_ALLOCVEC+Bj
mov aret, bx
rdrand_ret: ; CODE XREF: F_ATTRIB+21j F_READRAND+14j
; ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_READRAND: ; DATA XREF: bdos:259Bo
call check_changed
cmp F_isfatfs, 0
jz cpm_readrand
mov cl, 3
jmp fat_rdwr ; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_readrand: ; CODE XREF: F_READRAND+8j
mov cl, 0FFh
call cpm_rwrand ; CL=-1 read 0 write
jnz rdrand_ret
jmp cpm_readrec
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_WRITERAND: ; DATA XREF: bdos:259Eo
call check_changed
cmp F_isfatfs, 0
jz f_writerand_cpm
mov cl, 2
jmp fat_rdwr ; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_writerand_cpm: ; CODE XREF: F_WRITERAND+8j
mov cl, 0
call cpm_rwrand ; CL=-1 read 0 write
jnz rdrand_ret
jmp cpm_writerec
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_SIZE: ; DATA XREF: bdos:25A1o
cmp F_isfatfs, 0
jz cpm_size
jmp fat_size
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_size: ; CODE XREF: F_SIZE+5j
mov bx, offset user_fcb+21h
xor ax, ax
mov [bx], ax
mov 2[bx], al
call search$extnum ; Find any extent of a file
jz cpm_size_notfnd
cpm_size_loop: ; CODE XREF: F_SIZE+34j
call getdptra
mov dx, 0Fh
call extent_size ; Take the largest value of the
; file sizes given by the various
; extents
call compare_recno
jb cpm_size_next
mov 2[bx], al
mov [bx], cx
cpm_size_next: ; CODE XREF: F_SIZE+25j
call searchn ; Search for the next directory element,
; assuming a previous call on search
mov byte ptr aret, 0
jnz cpm_size_loop
cpm_size_notfnd: ; CODE XREF: F_SIZE+17j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_RANDREC: ; DATA XREF: bdos:25A4o
mov bx, offset user_fcb
mov dx, 20h
call extent_size ; Convert a size (extent + record no)
; to a 3-byte record number.
mov 21h[bx], cx
mov 23h[bx], al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_RESET: ; CODE XREF: DRV_ALLRESET+6p
; DATA XREF: bdos:25A7o
call get_drvs_in_use ; Return bitmap of all drives in use by processes
push ax
and ax, fs_param_low
jz reset_none
and ax, removable_drive
mov dl, 10h
reset_loops: ; CODE XREF: DRV_RESET+2Cj
dec dl
shl ax, 1
jnb reset_next
push ax
push dx
call tmpselect_dir
mov bx, lsn$add
mov byte ptr 1[bx], 0FFh
mov xios_bh_gdopen, 0FFh
pop dx
pop ax
reset_next: ; CODE XREF: DRV_RESET+14j
or ax, ax
jnz reset_loops
reset_none: ; CODE XREF: DRV_RESET+8j
pop ax
not ax
and ax, fs_param_low
reset37x: ; CODE XREF: media$change+15j
not ax
and login_vector, ax
and readonly_vector, ax
and removable_drive, ax
mov curdsk, 0FFh
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_WRITEZF: ; DATA XREF: bdos:25B0o
call check_changed
cmp F_isfatfs, 0
jz cpm_writezf
mov cl, 2
jmp fat_rdwr ; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_writezf: ; CODE XREF: F_WRITEZF+8j
mov cl, 0
call cpm_rwrand ; CL=-1 read 0 write
jz j_fat_wrrec2
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_fat_wrrec2: ; CODE XREF: F_WRITEZF+14j
jmp cpm_writerec
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_SPACE: ; DATA XREF: bdos:25B9o
call tmpselect_dir
cmp F_isfatfs, 0
jz cpm_space
jmp fat_space
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_space: ; CODE XREF: DRV_SPACE+8j
mov si, dph_alv
call get$nalbs ; Return ALV size in bytes
xor cx, cx
cpm_space_loop: ; CODE XREF: DRV_SPACE+23j
lodsb
cpm_space_ctbit: ; CODE XREF: DRV_SPACE+20j
or al, al
jz cpm_space_next
cpm_space_ckbit: ; CODE XREF: DRV_SPACE+1Dj
shr al, 1
jnb cpm_space_ckbit
inc cx
jmps cpm_space_ctbit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_space_next: ; CODE XREF: DRV_SPACE+19j
dec bx
jnz cpm_space_loop ; CX = count of used blocks
mov bx, dpb_dsm
inc bx
sub bx, cx ; BX = count of free blocks
mov cl, dpb_bsh
xor ch, ch
mov al, bh
xor ah, ah
shl bx, cl ; Convert to records
shl ax, cl
mov di, userdma
push ds
mov ds, userdmaseg
mov [di], bx
mov 2[di], ah
pop ds
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_FLUSH: ; CODE XREF: DRV_ALLRESET+1Fj
; DATA XREF: bdos:25BCo
cmp fs_function, 15h
jz flush0 ; Function 98 entry point
mov al, 0Ch ; XIOS flush
call fs_call_xios
call diocomp
flush0: ; CODE XREF: DRV_FLUSH+5j
; DATA XREF: bdos:25BFo ...
mov bx, login_vector; Function 98 entry point
mov dl, 10h
flush1: ; CODE XREF: DRV_FLUSH+1Dj
dec dl
shl bx, 1
jb flush2a
flush5: ; CODE XREF: DRV_FLUSH+74j
or bx, bx
jnz flush1
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
flush2a: ; CODE XREF: DRV_FLUSH+19j
push bx
push dx
call tmpselect_dir
cmp fs_function, 1Bh; Flush or reset allocation?
jnz flush_not3
call not_drv_logged
jz ptsync_drvfail
call copy$alv
jmps flush4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ptsync_drvfail: ; CODE XREF: DRV_FLUSH+2Fj
mov byte ptr aret, 0FFh
jmps flush4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
flush_not3: ; CODE XREF: DRV_FLUSH+2Aj
cmp fs_function, 15h
jz flush35
cmp fs_function, 23h
jz flush34
call flushx
cmp linfo, 0FFh ; Discard buffers?
jnz flush4
jmps flush35
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
flush34: ; CODE XREF: DRV_FLUSH+49j
push ds
mov ds, rlr
mov proc_using_drvs, 0
pop ds
call not_drv_logged
jz flush35
call copy$alv
flush35: ; CODE XREF: DRV_FLUSH+42j
; DRV_FLUSH+55j ...
mov bx, dph_dtabcb
call proc$discard ; Free BCBs on bcb_drive used by current process
flush4: ; CODE XREF: DRV_FLUSH+34j
; DRV_FLUSH+3Bj ...
pop dx
pop bx
jmp flush5
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
call_xios_flush: ; CODE XREF: F_CLOSE+3Ap fat_close+43p
mov al, 0Ch
call fs_call_xios
call diocomp
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
flushx: ; CODE XREF: check$nprs+100p
; DRV_FLUSH+4Bp ...
test dpb_phm, 0FFh
jnz flushx1
flushxret: ; CODE XREF: trunc_save_dcnt+5j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
flushx1: ; CODE XREF: flushx+5j
mov ah, 4
jmp deblock$dta
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
trunc_save_dcnt: ; CODE XREF: F_TRUNCATE+68p
; F_TRUNCATE+90p
cmp byte ptr xdcnt+1, 0FDh
jnz flushxret
jmp save$dcnt$pos0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_TRUNCATE: ; DATA XREF: bdos:25C2o
call copy8fromdma
call sel1_fcb_drive
call check$wild
cmp F_isfatfs, 0
jz cpm_truncate
jmp fat_truncate
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_truncate: ; CODE XREF: F_TRUNCATE+Ej
call chk$password
jz cpm_truncate0
call chk$pw$error
cpm_truncate0: ; CODE XREF: F_TRUNCATE+16j
call get$atts
mov cl, 0FFh
call cpm_rwrand ; CL=-1 read 0 write
jz cpm_truncate2
cpm_truncate1: ; CODE XREF: F_TRUNCATE+37j
; F_TRUNCATE+3Cj
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_truncate2: ; CODE XREF: F_TRUNCATE+23j
call seek$copy
call getdptra
mov dx, 0Fh
call extent_size ; Convert a size (extent + record no)
; to a 3-byte record number.
call compare_recno
jbe cpm_truncate1
call search$extnum ; Find any extent of a file
jz cpm_truncate1
call check$rodir
mov byte ptr xdcnt+1, 0FDh
cpm_truncate3: ; CODE XREF: F_TRUNCATE+88j
call getdptra
add bx, 0Ch
mov si, offset user_fcb+0Ch
mov al, 2[si]
and al, 3Fh
cmp 2[bx], al
jnz cpm_truncate4
mov al, [bx]
mov cl, [si]
call compext ; Compare extent nos in AL and CL
; Return nonzero if they do not match
jz cpm_truncate4
mov al, [bx]
cmp al, cl
cpm_truncate4: ; CODE XREF: F_TRUNCATE+57j
; F_TRUNCATE+60j
jnb cpm_truncate5
call trunc_save_dcnt
jmps trunc2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_truncate5: ; CODE XREF: F_TRUNCATE+66j
pushf
mov cl, 0
call scandm$ab
push cs
call f_interrupt
jz trunc3
call getdptra
mov byte ptr [bx], 0E5h
call seek$copy
call fix$hash
trunc2: ; CODE XREF: F_TRUNCATE+6Bj
; F_TRUNCATE+FEj
call searchn ; Search for the next directory element,
; assuming a previous call on search
jnz cpm_truncate3
call update$stamp
jmp copy$dir$loc
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
trunc3: ; CODE XREF: F_TRUNCATE+77j
call trunc_save_dcnt
call getfcb ; Set variables from currently addressed FCB
call dm$position
inc al
test single, 0FFh ; Nonzero if using 8-bit blocks
jnz trunc3a
shl al, 1
trunc3a: ; CODE XREF: F_TRUNCATE+A0j
mov di, offset user_fcb+10h
xor ah, ah
add di, ax
mov cl, 10h
sub cl, al
mov ch, ah
mov al, ah
rep stosb
call get$dir$ext ; Compute directory extent from FCB
cmp al, [bx]
mov [bx], al
pushf
mov al, user_fcb+20h
inc al
mov si, offset user_fcb+0Fh
mov [si], al
push cs
call f_interrupt
jz trunc3b
call set$rc3
trunc3b: ; CODE XREF: F_TRUNCATE+CBj
test dminx, 0FFh
jnz trunc3c
call set$rc3
trunc3c: ; CODE XREF: F_TRUNCATE+D5j
call getdptra
add bx, 0Bh
and byte ptr [bx], 7Fh
mov al, user_fcb+0Ch
mov 1[bx], al
add bx, 4
mov si, offset user_fcb+0Fh
mov di, bx
mov cx, 11h
rep movsb
mov cl, 1
call scandm$ab
call seek$copy
jmp trunc2
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_SETLABEL: ; DATA XREF: bdos:25C5o
mov cl, 10h
call copyfromdma
call sel1_fcb_drive
cmp F_isfatfs, 0
jz cpm_setlabel
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_setlabel: ; CODE XREF: DRV_SETLABEL+Dj
mov user_fcb, 21h ; Datestamped?
mov cl, 1
call search
jnz sdl0
mov bx, offset user_fcb+0Ch
test byte ptr [bx], 70h
jz sdl0
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
sdl0: ; CODE XREF: DRV_SETLABEL+1Cj
; DRV_SETLABEL+24j
mov user_fcb, 20h
mov cl, 1
mov xdcnt, 0FFFFh
call search
jnz sdl1
mov make$xfcb, 0FFh
call make
jnz sdl0a
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
sdl0a: ; CODE XREF: DRV_SETLABEL+43j
call init$xfcb
mov cx, 18h
call stamp5
call stamp1
sdl1: ; CODE XREF: DRV_SETLABEL+39j
mov cx, 1Ch
call stamp5
call stamp2
call chk_xfcb_passwd
jz sdl1a
jmp pw$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
sdl1a: ; CODE XREF: DRV_SETLABEL+5Ej
xor cx, cx
call init$xfcb0
mov si, dx
lodsb
or al, 1
mov [bx], al
mov di, lsn$add
stosb
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
sdl2: ; CODE XREF: F_WRITEXFCB+5Fp
dec si
lodsb
and al, 1
jz sdl3
mov si, offset passwd_buf+8
call set$pw
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
sdl3: ; CODE XREF: F_MAKE+D1p sdl2+4j
; ...
call seek$copy
jmp fix$hash
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
DRV_GETLABEL: ; DATA XREF: bdos:25C8o
call tmpselect_dir
cmp F_isfatfs, 0
jz cpm_getlabel
mov al, 21h ; FAT filesystems always use 21h
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_getlabel: ; CODE XREF: DRV_GETLABEL+8j
call get$dir$mode
jmp sta$ret
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_TIMEDATE: ; DATA XREF: bdos:25CBo
call sel1_fcb_drive
call check$wild
cmp F_isfatfs, 0
jz cpm_timedate
jmp fat_timedate
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_timedate: ; CODE XREF: F_TIMEDATE+Bj
call find_extent_0 ; Find the first extent of a file
jz wxfcb0a
mov ch, 0
call get$dtba
or al, al
jnz cpm_timedate1
push bx
mov di, offset user_fcb+10h
mov cx, 8
rep stosb
pop si
mov cl, 4
rep movsw
lodsb
mov user_fcb+0Ch, al
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_timedate1: ; CODE XREF: F_TIMEDATE+1Cj
call get$xfcb
mov al, 0FFh
jnz cpm_timedate2
jmp sta$ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_timedate2: ; CODE XREF: F_TIMEDATE+36j
mov bx, offset user_fcb
mov cl, 20h
jmp move ; Copy CL bytes from DX to BX
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_WRITEXFCB: ; DATA XREF: bdos:25CEo
mov cl, 10h
call copyfromdma
call sel1_fcb_drive
cmp F_isfatfs, 0
jz cpm_wrxfcb
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_wrxfcb: ; CODE XREF: F_WRITEXFCB+Dj
call get$dir$mode
and al, 80h
jnz wxfcb0
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wxfcb0: ; CODE XREF: F_WRITEXFCB+17j
call check$wild
mov xdcnt, 0FFFFh
call search$extnum ; Find any extent of a file
jnz wxfcb0b
wxfcb0a: ; CODE XREF: F_TIMEDATE+13j
; F_WRITEXFCB+36j ...
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wxfcb0b: ; CODE XREF: F_WRITEXFCB+28j
call get$xfcb
jnz wxfcb1
mov make$xfcb, al
call make
jz wxfcb0a
call init$xfcb
wxfcb1: ; CODE XREF: F_WRITEXFCB+2Ej
call chk_xfcb_passwd
jz wxfcb1a
jmp pw$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wxfcb1a: ; CODE XREF: F_WRITEXFCB+3Ej
mov si, offset user_fcb+0Ch
test byte ptr [bx], 0FFh
jnz wxfcb2
lodsb
dec si
and al, 1
jnz wxfcb2
call sdl3
jmps wxfcb4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
wxfcb2: ; CODE XREF: F_WRITEXFCB+49j
; F_WRITEXFCB+4Fj
lodsb
and al, 0E0h
jnz wxfcb3
mov al, 80h
wxfcb3: ; CODE XREF: F_WRITEXFCB+59j
mov [bx], al
call sdl2
wxfcb4: ; CODE XREF: F_WRITEXFCB+54j
call get$xfcb1
and al, 0E0h
mov pw$mode, al ; Password mode
push ax
call find_extent_0 ; Find the first extent of a file
pop ax
mov user_fcb+0Ch, al
jz wxfcb0a
call get$dtba$8
or al, al
jnz wxfcb0a
mov al, pw$mode ; Password mode
mov [bx], al
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_PASSWD: ; DATA XREF: bdos:25D1o
mov cl, 8
call copy_fcb
mov cur_fcb_len, 0
mov si, offset user_fcb
mov bx, si
mov di, offset df$password+7; Default password
mov cx, 8
jmp set$pw0
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_BDOS_74: ; DATA XREF: bdos:25D4o
call check_changed
call copy8fromdma
call check$write
cmp F_isfatfs, 0
jz cpm_bdos_74
jmp fat_bdos_74
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cpm_bdos_74: ; CODE XREF: F_BDOS_74+Ej
mov ah, user_fcb+0Ch
mov al, user_fcb+0Eh
push ax
call find_extent_0 ; Find the first extent of a file
pop ax
mov user_fcb+0Ch, ah
mov user_fcb+0Eh, al
jz cpm_74b
mov cl, 50h
call qstamp
jnz cpm_74a
mov ch, 0
call get$dtba
or al, al
jnz cpm_74a
mov dx, offset passwd_buf
call stamp_compare
cpm_74a: ; CODE XREF: F_BDOS_74+2Dj
; F_BDOS_74+36j
mov cl, 20h
call qstamp
jnz cpm_74b
mov ch, 4
call get$dtba
or al, al
jnz cpm_74b
mov dx, offset passwd_buf+4
call stamp_compare
or user_fcb+0Eh, 40h
cpm_74b: ; CODE XREF: F_BDOS_74+26j
; F_BDOS_74+43j ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
F_BDOS_75: ; DATA XREF: bdos:25DAo
mov si, dx
mov di, offset int13_func
push ds
mov ds, fs_param_ds
mov cx, 0Ah
rep movsb
pop ds
mov dl, int13_drive
call tmpselect_dir
call flushx
mov ax, word ptr int13_buffer+2
mov word ptr fs_buffer, ax
mov ax, word ptr int13_buffer
mov word ptr fs_buffer+2, ax
mov al, int13_sectors
mov fs_rdwrcount, al
cmp int13_func, 3
jnb bdos75c
xor ah, ah
mov al, int13_sector
mov fs_sector, ax
mov ah, int13_head
mov al, int13_cylinder
mov fs_track, ax
cmp int13_func, 0
jnz bdos75_notread
mov al, 23h
call xios_rdwr
mov aret, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos75_notread: ; CODE XREF: F_BDOS_75+4Aj
cmp int13_func, 1
jnz bdos75_notwrite
call discard$both
mov al, 24h
call xios_rdwr
mov aret, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos75_notwrite: ; CODE XREF: F_BDOS_75+5Aj
mov fs_rdwrcount, 1
mov si, dph_dirbcb
mov si, [si]
bdos75a: ; CODE XREF: F_BDOS_75+81j
cmp byte ptr [si], 0FFh
jz bdos75b
mov bx, 12[si]
or bx, bx
jz bdos75b
mov si, bx
jmps bdos75a
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos75b: ; CODE XREF: F_BDOS_75+76j
; F_BDOS_75+7Dj
mov byte ptr [si], 0FFh
mov ax, 10[si]
mov word ptr fs_buffer+2, ax
mov word ptr fs_buffer, ds
mov al, 23h
call xios_rdwr
mov aret, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos75c: ; CODE XREF: F_BDOS_75+31j
mov ax, word ptr int13_sector
xor dx, dx
div dpb_spt
mov fs_track, ax
mov fs_sector, dx
cmp int13_func, 4
jz bdos75d
mov al, 0Ah
call xios_rdwr
mov aret, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos75d: ; CODE XREF: F_BDOS_75+AEj
call discard$both
mov al, 0Bh
call xios_rdwr
mov aret, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
discard$both: ; CODE XREF: F_BDOS_75+5Cp
; F_BDOS_75+B9p
mov bx, dph_dtabcb
call discard$data ; Called with BX->BCB chain head. Release all BCBs for a drive
jmp discard$dir ; Release all directory BCBs for a drive
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
log$fxs db 0Ch, 2, 3, 4, 6, 9, 0Ah, 0Dh, 11h, 1Ch, 1Dh, 1Fh, 20h
db 0,0,0,0
; DATA XREF: tst$log$fxs+7o
rw$fxs db 5, 7, 8, 0Fh, 10h, 16h, 0, 0
; Read or write functions
sc$fxs db 2, 3, 5, 0, 0
; Close or search functions
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
srch_fat: ; CODE XREF: F_SFIRST+41j
popf
pushf
jnz srch_fat1
call set$end$dir
mov ff2c_extent, 0
srch_fat1: ; CODE XREF: srch_fat+2j
cmp cl, 0
jz srch_fat2
mov bx, offset user_fcb+0Ch
cmp byte ptr [bx], 3Fh
mov cl, 2
jz srch_fat2
mov cl, 3
mov al, [bx]
xor ah, ah
mov ff2c_extent, ax
srch_fat2: ; CODE XREF: srch_fat+10j srch_fat+1Aj
cmp cl, 3
jnb srch_fat3
test ff2c_extent, 0FFFFh
jz srch_fat3
dec dcnt
srch_fat3: ; CODE XREF: srch_fat+28j srch_fat+30j
mov searchl, cl
srch_fat4: ; CODE XREF: srch_fat+5Fj srch_fat+6Ej
; ...
mov cl, searchl
xor ch, ch
call fat_search1
or ax, ax
jnz srch_fat5
popf
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat5: ; CODE XREF: srch_fat+45j
cmp searchl, 2
jb srch_fat6
mov bx, ax
test byte ptr 11[bx], 10h
jz srch_fat6
test fcb_is_for_dir, 0FFh
jz srch_fat4
srch_fat6: ; CODE XREF: srch_fat+50j srch_fat+58j
cmp searchl, 3
jnz srch_fat7
call fat_extents
cmp ax, 0FFFFh
jz srch_fat4
srch_fat7: ; CODE XREF: srch_fat+66j
popf
jnz srch_fat8
cmp searchl, 0
jnz srch_fat8
jmp srch_fat12
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat8: ; CODE XREF: srch_fat+71j srch_fat+78j
pushf
mov bx, p_dirent
test byte ptr 11[bx], 8
jnz srch_fat4
popf
push es
mov es, userdmaseg
mov di, userdma
mov bx, p_dirent
cmp byte ptr [bx], 0
jz srch_fat9
cmp byte ptr [bx], 0E5h
jnz srch_fat10
srch_fat9: ; CODE XREF: srch_fat+99j
mov al, 0E5h
stosb
xor ax, ax
mov cx, 7Fh
rep stosb
jmps srch_fat11
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat10: ; CODE XREF: srch_fat+9Ej
call fat_extents
xor bx, bx
push bx
push ax
push di
call fat_fcb_to_cpm
pop di
pop bx
pop ax
add di, 20h
mov cx, 20h
rep stosw
call fat_to_sfcb ; Generate a fake CP/M SFCB [datestamp] record
inc ff2c_extent
call fat_extents
cmp ax, 0FFFFh
jnz srch_fat11
mov ff2c_extent, 0
srch_fat11: ; CODE XREF: srch_fat+AAj srch_fat+CFj
pop es
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat12: ; CODE XREF: srch_fat+7Aj srch_fat+F4j
mov bx, p_dirent
mov al, [bx]
cmp al, 0
jz srch_fat15
cmp al, 0E5h
jz srch_fat13
test byte ptr 11[bx], 8
jnz srch_fat14
srch_fat13: ; CODE XREF: srch_fat+E5j
sub cx, cx
call fat_search1
test bx, bx
jnz srch_fat12
jmps srch_fat15
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat14: ; CODE XREF: srch_fat+EBj
mov es, userdmaseg
mov di, userdma
mov al, 20h
stosb
lea si, [bx]
mov cx, 0Bh
rep movsb
jmps srch_fat16
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fat15: ; CODE XREF: srch_fat+E1j srch_fat+F6j
mov es, userdmaseg
mov di, userdma
mov al, 20h
mov cx, 0Ch
rep stosb
srch_fat16: ; CODE XREF: srch_fat+10Aj
push es
push di
push ds
pop es
call set$end$dir
sub cx, cx
call fat_search1
pop di
pop es
mov al, 21h
stosb
xor ax, ax
stosw
mov al, 80h
stosb
stosb
stosb
xor ax, ax
mov cx, 27h
rep stosw
mov al, 21h
stosb
xor al, al
mov cx, 1Fh
rep stosb
push ds
pop es
test byte ptr 11[bx], 8
jnz srch_fatret
jmp set$end$dir
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
srch_fatret: ; CODE XREF: srch_fat+14Bj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
c2f_to_extent: ; CODE XREF: fat_rdwr+363p
xor ah, ah
mov al, c2f_S2
mov cl, 5
shl ax, cl
or al, c2f_EX
mov ff2c_extent, ax
mov ax, word ptr user_fcb+1Ch
mov dx, word ptr user_fcb+1Eh
jmps size_to_cpm
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_extents: ; CODE XREF: srch_fat+68p srch_fat+ACp
; ...
mov bx, p_dirent
mov ax, 28[bx]
mov dx, 30[bx] ; File size
size_to_cpm: ; CODE XREF: c2f_to_extent+17j
mov bx, ax
mov cl, 0Eh
call shr_dxax_cl ; Size in extents
and bx, 3FFFh
or bx, bx ; Size in current extent
jnz size_ok
or ax, ax
jz size_ok
dec ax
mov bx, 4000h ; Round up
size_ok: ; CODE XREF: fat_extents+17j
; fat_extents+1Bj
cmp ax, ff2c_extent
jnb fat_exte2
mov ax, 0FFFFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_exte2: ; CODE XREF: fat_extents+25j
ja fat_exte3
mov ax, bx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_exte3: ; CODE XREF: fat_extents+2Bj
mov ax, 4000h
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_fcb_to_cpm: ; CODE XREF: srch_fat+B4p cpm_opendir+16Dp
; ...
push bp
mov bp, sp
mov di, 4[bp]
test word ptr 8[bp], 0FFFFh
jnz ff2c_skipuser
mov al, usrcode ; User ID
mov es:[di], al
ff2c_skipuser: ; CODE XREF: fat_fcb_to_cpm+Bj
xor bx, bx
mov si, p_dirent
ff2c_copyname: ; CODE XREF: fat_fcb_to_cpm+63j
cmp bl, 0Bh
jnb ff2c_namedone
xor al, al
cmp bl, 4
ja ff2c_notFattr
mov al, 12[si]
mov cl, bl ; Generate F1-F4 from dir entry
shl al, cl
and al, 80h
jmps ff2c_notT3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ff2c_notFattr: ; CODE XREF: fat_fcb_to_cpm+23j
cmp bl, 8
jnz ff2c_notT1
test byte ptr 11[si], 1; R/O
jz ff2c_notT3
jmps ff2c_haveattr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ff2c_notT1: ; CODE XREF: fat_fcb_to_cpm+33j
cmp bl, 9
jnz ff2c_notT2
test byte ptr 11[si], 4; SYS
jz ff2c_notT3
jmps ff2c_haveattr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ff2c_notT2: ; CODE XREF: fat_fcb_to_cpm+40j
cmp bl, 0Ah
jnz ff2c_notT3 ; ARCV
test byte ptr 11[si], 20h
jnz ff2c_notT3
ff2c_haveattr: ; CODE XREF: fat_fcb_to_cpm+3Bj
; fat_fcb_to_cpm+48j
mov al, 80h
ff2c_notT3: ; CODE XREF: fat_fcb_to_cpm+2Ej
; fat_fcb_to_cpm+39j
; ...
mov dl, [bx+si]
and dl, 7Fh
or dl, al
mov es:1[bx+di], dl
inc bx
jmps ff2c_copyname
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ff2c_namedone: ; CODE XREF: fat_fcb_to_cpm+1Cj
mov ax, ff2c_extent
and ax, 1Fh
mov es:12[di], al ; Extent, low bits
mov ax, 6[bp]
mov dl, al
and dl, 7Fh
shl ax, 1
mov al, dl
or al, al
jz ff2c_bytesize
inc ah
ff2c_bytesize: ; CODE XREF: fat_fcb_to_cpm+7Dj
test word ptr 8[bp], 0FFFFh
jnz ff2c_S2
mov es:13[di], al ; File size
ff2c_S2: ; CODE XREF: fat_fcb_to_cpm+86j
mov bx, ff2c_extent
mov cl, 5
shr bx, cl
mov es:14[di], bl ; Extent, high
mov es:15[di], ah
mov al, 80h ; Flags for bytes 16/17
test byte ptr 11[si], 10h; Directory?
jz ff2c_isdir
or al, 40h ; Bit 6 => dir
ff2c_isdir: ; CODE XREF: fat_fcb_to_cpm+A2j
test byte ptr 11[si], 2
jz ff2c_hid
or al, 20h ; Bit 5 => hidden
ff2c_hid: ; CODE XREF: fat_fcb_to_cpm+AAj
mov bx, dcnt
or al, bh
mov es:16[di], al
mov es:17[di], al
mov es:18[di], bl
xor ax, ax
mov es:19[di], al
mov es:20[di], ax
lea di, 22[di]
lea si, 22[si]
mov cx, 5
rep movsw
pop bp
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Generate a fake CP/M SFCB [datestamp] record
fat_to_sfcb: ; CODE XREF: srch_fat+C2p
mov al, 21h
stosb
mov bx, p_dirent
mov ax, 24[bx]
mov bx, 22[bx] ; Got a DOS datestamp?
or ax, bx
jnz f2sfcb_1
mov cx, 1Fh
rep stosb
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f2sfcb_1: ; CODE XREF: fat_to_sfcb+Fj
call fat_get_date
call dos_date_to_cpm
xor ax, ax
stosw
stosw
mov si, offset fs_days
movsw
movsw
mov cx, 15h
rep stosb
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_get_date: ; CODE XREF: fat_to_sfcb+17p
; fat_timedate+14p
mov bx, p_dirent
mov ax, 24[bx]
mov dl, al
and dl, 1Fh
mov fat_year, dl
mov cl, 5
shr ax, cl
mov dl, al
and dl, 0Fh
mov fat_month, dl
mov cl, 4
shr ax, cl
mov fat_day, al
mov ax, 22[bx]
mov dl, al
and dl, 1Fh
mov fat_second, dl
mov cl, 5
shr ax, cl
mov dl, al
and dl, 3Fh
mov fat_minute, dl
mov cl, 6
shr ax, cl
mov fat_hour, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_set_date: ; CODE XREF: fat_make+93p fat_make+100p
; ...
mov bx, p_dirent
mov al, fat_day
mov cl, 4
shl ax, cl
add al, fat_month
mov cl, 5
shl ax, cl
add al, fat_year
mov 24[bx], ax
mov al, fat_hour
mov cl, 6
shl ax, cl
add al, fat_minute
mov cl, 5
shl ax, cl
add al, fat_second
mov 22[bx], ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
dos_date_to_cpm: ; CODE XREF: fat_to_sfcb+1Ap
; fat_timedate+17p
xor bx, bx
mov bl, fat_month
dec bx
add bx, bx
mov ax, monthDays[bx]
push ax
xor ah, ah
mov al, fat_day
inc ax
inc ax
mov bx, 365
mul bx
pop bx
add ax, bx
xor bx, bx
mov bl, fat_year
add ax, bx
push ax
mov bl, fat_month
xor bh, bh
mov al, fat_day
add al, 4
xor ah, ah
call leap_year_test
pop bx
add ax, bx
mov fs_days, ax
mov al, fat_hour
call pack_bcd
mov fs_hours, al
mov al, fat_minute
call pack_bcd
mov fs_minutes, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_today: ; CODE XREF: fat_make+90p fat_truncate+96p
mov si, offset date_days
mov di, offset fs_days
mov cx, 5
rep movsb
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
timestamp_2_fat: ; CODE XREF: fat_bdos_74+15p
mov cx, offset rlr
mov bx, fs_days
dec bx
ts2fat_year1: ; CODE XREF: timestamp_2_fat+18j
mov dx, 365
test cl, 3
jnz ts2fat_noleap
inc dx
ts2fat_noleap: ; CODE XREF: timestamp_2_fat+Ej
cmp bx, dx
jb ts2fat_nextyear
sub bx, dx
inc cx
jmps ts2fat_year1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ts2fat_nextyear: ; CODE XREF: timestamp_2_fat+13j
xor dx, dx
test cl, 3
jnz ts2fat_feb
cmp bx, 59
jbe ts2fat_feb
mov dx, 1
ts2fat_feb: ; CODE XREF: timestamp_2_fat+1Fj
; timestamp_2_fat+24j
mov si, 18h
tst2fat_months1: ; CODE XREF: timestamp_2_fat+3Aj
dec si
dec si
or si, si
jz ts2fat_months2
mov ax, monthDays[si]
add ax, dx
cmp ax, bx
ja tst2fat_months1
ts2fat_months2: ; CODE XREF: timestamp_2_fat+30j
sub cx, 50h
mov fat_day, cl
mov ax, si
shr al, 1
inc al
mov fat_month, al
mov ax, monthDays[si]
sub bx, ax
sub bx, dx
inc bl
mov fat_year, bl
mov al, fs_hours
call bcd2bin
mov fat_hour, al
mov al, fs_minutes
call bcd2bin
mov fat_minute, al
mov al, fs_seconds
call bcd2bin
shr al, 1
mov fat_second, al
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
leap_year_test: ; CODE XREF: dos_date_to_cpm+33p
mov dx, ax
shr ax, 1
shr ax, 1
test dx, 3
jnz lyt_ret
dec bx
add bx, bx
mov bx, monthDays[bx]
cmp bx, 59
jnb lyt_ret
dec ax
lyt_ret: ; CODE XREF: leap_year_test+Aj
; leap_year_test+16j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
pack_bcd: ; CODE XREF: dos_date_to_cpm+3Fp
; dos_date_to_cpm+48p
xor ah, ah
pack_b1: ; CODE XREF: pack_bcd+Bj
cmp al, 0Ah
jb pack_b2
sub al, 0Ah
add ah, 10h
jmps pack_b1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
pack_b2: ; CODE XREF: pack_bcd+4j
add al, ah
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
bcd2bin: ; CODE XREF: timestamp_2_fat+5Dp
; timestamp_2_fat+66p
; ...
xor ah, ah
bcd2bin1: ; CODE XREF: bcd2bin+Bj
cmp al, 10h
jb bcd2bin2
sub al, 10h
add ah, 0Ah
jmps bcd2bin1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bcd2bin2: ; CODE XREF: bcd2bin+4j
add al, ah
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
lookup_dirent: ; CODE XREF: fat_open+1Fp fat_close+22p
; ...
call set$end$dir
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_dirent_next: ; CODE XREF: fat_delete+10p
; fat_delete+96p ...
mov cx, 2
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_search1: ; CODE XREF: srch_fat+40p srch_fat+EFp
; ...
push cx
call read$subdir
pop cx
mov p_dirent, ax
mov bx, ax
or ax, ax
jz scd_4
cmp cl, 0
jnz scd_1
scd_retbx: ; CODE XREF: fat_search1+1Fj
; fat_search1+23j
mov ax, bx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scd_1: ; CODE XREF: fat_search1+11j
cmp cl, 1
jnz scd_2
mov al, [bx]
or al, al
jz scd_retbx
cmp al, 0E5h
jz scd_retbx
jmps scd_next
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scd_2: ; CODE XREF: fat_search1+19j
push bx
call get_cwd_cluster
pop bx
jnz scd_5
mov ax, dcnt
mov si, cdrmaxa
cmp ax, [si]
jb scd_5
scd_3: ; CODE XREF: fat_search1+45j
xor ax, ax
mov p_dirent, ax
scd_4: ; CODE XREF: fat_search1+Cj
mov bx, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scd_5: ; CODE XREF: fat_search1+2Cj
; fat_search1+37j
mov al, [bx]
or al, al
jz scd_3
cmp al, 0E5h
jz scd_next
test byte ptr 11[bx], 8
jnz scd_next
call fat_matchname
or al, al
jz scd_next
mov ax, p_dirent
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
scd_next: ; CODE XREF: fat_search1+25j
; fat_search1+49j ...
jmp fat_search1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_matchname: ; CODE XREF: fat_search1+51p
mov al, ch
push cx
xor ah, ah
mov si, offset user_fcb+1
add si, ax
mov cx, 0Bh
fat_matchn1: ; CODE XREF: fat_matchname+23j
mov al, [si]
xor al, [bx]
test al, 7Fh
jz fat_matchn2
mov al, [si]
xor al, 3Fh
test al, 7Fh
jz fat_matchn2
xor al, al
pop cx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_matchn2: ; CODE XREF: fat_matchname+13j
; fat_matchname+1Bj
inc si
inc bx
loop fat_matchn1
or al, 1
pop cx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
shl_dxax_cl: ; CODE XREF: fat_truncate+2Fp
xor ch, ch
shl_loop: ; CODE XREF: shl_dxax_cl+6j
shl ax, 1
rcl dx, 1
loop shl_loop
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
shr_dxax_cl: ; CODE XREF: fat_extents+Ep
; size_to_records+Fp
; ...
xor ch, ch
shr_loop: ; CODE XREF: shr_dxax_cl+6j
shr dx, 1
rcr ax, 1
loop shr_loop
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mul cx
push dx
xchg ax, bx
mul cx
pop dx
add ax, dx
xchg ax, bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_muldiv: ; CODE XREF: fat_rdwr+CDp
jcxz fat_mdiv0
cmp cx, 1
jnz fat_mdiv1
mov dx, bx
xor cx, cx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mdiv1: ; CODE XREF: fat_muldiv+5j
xor dx, dx
xchg ax, bx
push ax
div cx
mov di, ax
mul cx
pop dx
sub dx, ax
mov ax, bx
div cx
mov cx, dx
mov dx, di
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mdiv0: ; CODE XREF: fat_muldivj
mov ax, 0FFFFh
mov dx, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_open: ; CODE XREF: F_OPEN+Dj
mov cl, 0C0h ; Get F5' and F6'
call get_sharemode
test fcb_is_for_dir, 0FFh
;
; Allow open of "." to work in the root directory even though it has
; no "." entry.
;
jz fat_open_notdot ; Not directory, so can't be '.'
call get_cwd_cluster
jnz fat_open_notdot ; Got cluster, so not the root
cmp user_fcb+1, '.'
jnz fat_open_notdot ; Not "."
cmp user_fcb+2, ' '
jz diropen_dot
fat_open_notdot: ; CODE XREF: fat_open+Aj fat_open+Fj
; ...
call lookup_dirent
or ax, ax
jnz open_got_dirent
test fcb_is_for_dir, 0FFh
jz open_fail
call get_cwd_cluster
jnz open_fail
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
cpm_opendir: ; CODE XREF: F_OPEN+17p
cmp user_fcb+1, '.'
jnz open_fail
cmp user_fcb+2, ' '
jnz open_fail
;
; CP/M only allows the fake "."
;
diropen_dot: ; CODE XREF: fat_open+1Dj fat_close+12j
mov ax, offset user_fcb+2
mov p_dirent, ax
mov user_fcb+0Dh, 10h; Faux "." entry for root
mov word ptr user_fcb+1Ch, 0
jmps open_got_dirent
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open_fail: ; CODE XREF: fat_open+2Bj fat_open+30j
; ...
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open_got_dirent: ; CODE XREF: fat_open+24j cpm_opendir+1Fj
test fcb_is_for_dir, 0FFh
jnz opendir_got
jmp open_file
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
opendir_got: ; CODE XREF: cpm_opendir+29j
xor bx, bx
mov bl, user_fcb+0Ch; BL = 0 for current drive,
; 1-3 to assign floating drive
cmp bl, 4
jnb open_fail
mov di, ax
test byte ptr 11[di], 10h
jz open_fail ; Not actually a directory
or bl, bl
jz opendir_setcwd
add bl, 0Ch
jmps assign_floatdrv
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
opendir_setcwd: ; CODE XREF: cpm_opendir+43j
cmp cur_drvdir, 0
jz chdir_fromroot
mov bl, chdir_drive
jmps assign_floatdrv
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
chdir_fromroot: ; CODE XREF: cpm_opendir+4Fj
mov bl, fcbdsk
sub bl, 1
jnb chdir_notfloat
push ds
mov ds, rlr
mov bl, proc_drive
pop ds
jmps assign_floatdrv
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
chdir_notfloat: ; CODE XREF: cpm_opendir+5Ej
and bl, 1Fh ; What? You support drives >P:?
cmp bl, 0Dh
jb chdir_realdrv
cmp bl, 0Fh
jbe assign_floatdrv
chdir_realdrv: ; CODE XREF: cpm_opendir+72j
mov bl, fs_fcbdrive
assign_floatdrv: ; CODE XREF: cpm_opendir+48j
; cpm_opendir+55j ...
push ds
mov ds, rlr
mov si, proc_dirname
pop ds
or si, si ; Do we have a current-directory
; structure to hand?
mov dx, si ; If not, fine.
jz dn_released
cmp word ptr 32[si], 1
jz dn_ref_was_1 ; If ref count is 1, take over the
; record which has now become free.
dec word ptr 32[si]
dn_released: ; CODE XREF: cpm_opendir+8Bj
pushf
cli
mov si, free_dirnames; Need a new dirname. Allocate one.
or si, si
jnz got_new_dirname
popf
jmps disk_error_11
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
got_new_dirname: ; CODE XREF: cpm_opendir+9Ej
mov ax, [si]
mov free_dirnames, ax
popf
push es
mov es, rlr
mov es:proc_dirname, si
pop es
or dx, dx ; Are we copying an existing structure?
jz gnd_blank ; No. Init to blanks.
mov bp, si
mov di, si ; Yes. Copy the template.
mov si, dx
mov cx, 12h
rep movsw
mov si, bp
jmps gnd_inited
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
gnd_blank: ; CODE XREF: cpm_opendir+B6j
xor ax, ax
mov di, si
mov cx, 12h
rep stosw
gnd_inited: ; CODE XREF: cpm_opendir+C5j
mov word ptr 32[si], 1; Set ref count to 1.
dn_ref_was_1: ; CODE XREF: cpm_opendir+91j
add bx, bx ; BX = drive ID
add si, bx
mov bx, [si] ; Is there a drvdir structure for
; this drive?
or bx, bx
jz need_new_dirdat
dec word ptr 8[bx] ; Decrease ref count
jz got_dirdata ; If it was one, take over the now-
; empty record.
need_new_dirdat: ; CODE XREF: cpm_opendir+DDj
push si
call dirdata_alloc
pop si
jnz got_dirdata
disk_error_11: ; CODE XREF: cpm_opendir+A1j
mov ah, 0Bh ; No room in system lock list
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
got_dirdata: ; CODE XREF: cpm_opendir+E2j
; cpm_opendir+E9j
mov [si], bx ; Point dirname structure at this drvdir
mov al, curdsk
mov [bx], al ; Drive
mov si, lsn$add
mov al, 2[si]
mov 1[bx], al ; Filesystem type
mov di, p_dirent
mov dx, 26[di]
cmp dx, dname_cluster
jnz not_opening_dot
mov si, cur_drvdir
or si, si
jz not_opening_dot
mov ax, 2[si] ; If opening ".", just keep what we
; had before.
mov cx, 4[si]
jmps setup_dirdata
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
not_opening_dot: ; CODE XREF: cpm_opendir+10Cj
; cpm_opendir+114j
mov ax, dname_cluster
mov cx, dcnt
setup_dirdata: ; CODE XREF: cpm_opendir+11Cj
mov 2[bx], ax ; Parent cluster
mov 4[bx], cx ; Offset of entry in parent dir?
mov 6[bx], dx ; Cluster of directory
mov word ptr 8[bx], 1
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open_file: ; CODE XREF: cpm_opendir+2Bj
mov bx, ax
test byte ptr 11[bx], 10h
jz open_file1
jmp open_fail
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
open_file1: ; CODE XREF: cpm_opendir+13Aj
cmp attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jnz open_file2
test byte ptr 11[bx], 1
jz open_file2
mov attributes, 20h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
open_file2: ; CODE XREF: cpm_opendir+144j
; cpm_opendir+14Aj
mov al, user_fcb+0Ch
and al, 1Fh
xor ah, ah
mov ff2c_extent, ax
call fat_extents
cmp ax, 0FFFFh
jnz open_file3
inc ax
open_file3: ; CODE XREF: cpm_opendir+161j
mov bx, 0FFFFh
push bx
push ax
mov bx, offset user_fcb
push bx
call fat_fcb_to_cpm
add sp, 6
cmp user_fcb+20h, 0FFh
jnz open_file4
mov bx, p_dirent
mov al, 28[bx]
and al, 7Fh
mov user_fcb+20h, al
open_file4: ; CODE XREF: cpm_opendir+178j
or user_fcb+0Eh, 80h
mov open_G01, 0FFh
jmp openx1a
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fs_noop: ; CODE XREF: fat_close+36p
; fat_make+13Bp
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get_sharemode: ; CODE XREF: fat_open+2p fat_make+2p
push cx
call get$atts
pop cx
and al, cl
cmp al, 0C0h ; Get sharing mode.
; If F5' and F6' set, F6' wins.
jnz gsm_1
mov al, 40h
gsm_1: ; CODE XREF: get_sharemode+9j
mov high$ext, al
shr al, 1
jnz gsm_2
mov al, 80h
gsm_2: ; CODE XREF: get_sharemode+12j
mov attributes, al ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_close: ; CODE XREF: F_CLOSE+Ej F_CLOSE+18j
; ...
test fcb_is_for_dir, 0FFh
jz fat_closefile
call get_cwd_cluster
jz not_in_subdir
xor bl, bl
mov user_fcb+0Ch, bl
jmp diropen_dot
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
not_in_subdir: ; CODE XREF: fat_close+Aj
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_closefile: ; CODE XREF: fat_close+5j
test byte ptr dpb_cks+1, 80h
jnz fcf_fixeddisc
mov dir_check_flag, 0F0h
fcf_fixeddisc: ; CODE XREF: fat_close+1Bj
call lookup_dirent
or ax, ax
jnz fcf_gotdirent
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fcf_gotdirent: ; CODE XREF: fat_close+27j
test user_fcb+0Eh, 80h
jnz fcf_fatclean
call write_FAT
fcf_fatclean: ; CODE XREF: fat_close+31j
call fs_noop
test user_fcb+0Eh, 40h
jz fcf_direntclean
call fat_wr_dirent
call call_xios_flush
fcf_direntclean: ; CODE XREF: fat_close+3Ej
and user_fcb+0Eh, 3Fh
or user_fcb+0Eh, 80h; Reset 'dirty' flags
jmp f_close_end
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_make: ; CODE XREF: F_MAKE+20j
mov cl, 80h
call get_sharemode
call lookup_dirent
or ax, ax
jz fmake_notfound
mov ah, 8
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fmake_notfound: ; CODE XREF: fat_make+Aj
call set$end$dir
mov cx, 1
call fat_search1
or ax, ax
jnz fat_make5
call get_cwd_cluster
jz fat_make4
fat_make2: ; CODE XREF: fat_make+2Ej
cmp ax, dpb_clusters
jnb fat_make3
push ax
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
pop bx
jmps fat_make2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_make3: ; CODE XREF: fat_make+27j
mov nearby_cluster, bx
mov ax, bx
call alloc_cluster
mov newdir_cluster, ax
mov bx, ax
or ax, ax
jz fat_make4
mov ax, nearby_cluster
call fat_wcluster ; Set cluster[AX] to BX
mov ax, newdir_cluster
mov bx, max_cluster
call fat_wcluster ; Set cluster[AX] to BX
call write_FAT
mov ax, newdir_cluster
call wr_cluster
call set$end$dir
mov cx, 1
call fat_search1
or ax, ax
jnz fat_make5
fat_make4: ; CODE XREF: fat_make+21j fat_make+40j
; ...
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_make5: ; CODE XREF: fat_make+1Cj fat_make+66j
xor bx, bx
mov si, p_dirent
fat_make6: ; CODE XREF: fat_make+80j
cmp bl, 0Bh
jnb fat_make7
mov al, user_fcb+1[bx]
and al, 7Fh
mov [bx+si], al
inc bl
jmps fat_make6
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_make7: ; CODE XREF: fat_make+74j
xor ax, ax
mov di, p_dirent
add di, 0Ch
mov cx, 0Ah
rep stosw
call fat_today
call fat_set_date
mov si, p_dirent
test fcb_is_for_dir, 0FFh
jnz fat_mkdir
jmp fat_mkfile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mkdir: ; CODE XREF: fat_make+9Fj
mov byte ptr 11[si], 10h; Is directory
xor ax, ax
call alloc_cluster
or ax, ax
jz fat_make4
mov newdir_cluster, ax
mov si, p_dirent
mov 26[si], ax
mov bx, max_cluster
call fat_wcluster ; Set cluster[AX] to BX
call write_FAT
call seek$copy
call set_cwd_cdr
mov ax, newdir_cluster
call wr_cluster
mov ax, newdir_cluster
xor bx, bx
call clus_to_sec
call setdir1
mov si, word ptr fs_buffer+2
mov byte ptr [si], '.'
xor bx, bx
fat_mkdir1: ; CODE XREF: fat_make+F0j
cmp bl, 0Ah
jnb fat_mkdir2
mov byte ptr 1[bx+si], 20h ; ' '
inc bl
jmps fat_mkdir1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mkdir2: ; CODE XREF: fat_make+E8j
mov byte ptr 11[si], 10h; Is directory
mov ax, newdir_cluster
mov 26[si], ax ; Cluster
mov p_dirent, si
call fat_set_date
mov si, word ptr fs_buffer+2
add si, 20h
mov word ptr [si], '..'
xor bx, bx
fat_mkdir3: ; CODE XREF: fat_make+11Bj
cmp bl, 9
jnb fat_mkdir4
mov byte ptr 2[bx+si], 20h ; ' '
inc bl
jmps fat_mkdir3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mkdir4: ; CODE XREF: fat_make+113j
mov byte ptr 11[si], 10h
call get_cwd_cluster
mov 26[si], ax
mov p_dirent, si
call fat_set_date
call seek
xor cx, cx
call wrbuff
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_mkfile: ; CODE XREF: fat_make+A1j
mov byte ptr 11[si], 20h ; ' '
call fs_noop
mov al, attributes ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
call set_cwd_cdr
call seek$copy
mov ff2c_extent, 0
mov bx, 0FFFFh
push bx
inc bx
push bx
mov bx, offset user_fcb
push bx
call fat_fcb_to_cpm
add sp, 6
or user_fcb+0Eh, 80h
mov al, open_G01
mov attributes, al ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jmp openx1a
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
set_cwd_cdr: ; CODE XREF: fat_make+C8p fat_make+141p
call get_cwd_cluster
jnz set_cwd_cdr_0
jmp setcdr
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
set_cwd_cdr_0: ; CODE XREF: set_cwd_cdr+3j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_delete: ; CODE XREF: F_DELETE+Aj
call get$atts
xor ax, ax
fat_del1: ; CODE XREF: fat_delete+CAj
cmp al, 2
jb fat_delpass
jmp j_write_FAT
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_delpass: ; CODE XREF: fat_delete+7j
push ax
call set$end$dir
fat_del_dirloop: ; CODE XREF: fat_delete+59j
; fat_delete+BEj
call fat_dirent_next
or ax, ax
pop ax
jnz fat_del_matched
jmp fat_del_nxtfile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_del_matched: ; CODE XREF: fat_delete+16j
test attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jz fat_del_file
retn ; Can't remove password; there is none
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_del_file: ; CODE XREF: fat_delete+20j
mov ah, 0FFh
or al, al
jnz fat_can_del_1
push ax
mov bx, p_dirent
test byte ptr 11[bx], 3; R/O or SYS?
jz fat_can_del
jmp rof$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_can_del: ; CODE XREF: fat_delete+32j
mov bx, offset user_fcb
call chk$wild_cpm
pop ax
jz fat_can_del_1
inc al
fat_can_del_1: ; CODE XREF: fat_delete+27j
; fat_delete+3Ej
cmp al, 1
jnz fat_del_skipf
push ax
mov bx, p_dirent
test byte ptr 11[bx], 10h
jz target_is_file
push bx
mov bx, offset user_fcb
call chk$wild_cpm
pop bx
jz fat_del_dirloop
test fcb_is_for_dir, 0FFh
jz cant_delete
mov ax, 26[bx] ; Cluster
mov cx, 2
fat_can_del_2: ; CODE XREF: fat_delete+7Aj
mov bx, ax
push ax
call is_dir_empty
pop ax
jz cant_delete
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
xor cx, cx
cmp ax, dpb_clusters
jb fat_can_del_2
jmps fat_del_ckinuse
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
cant_delete: ; CODE XREF: fat_delete+60j
; fat_delete+6Fj ...
pop ax
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_del_ckinuse: ; CODE XREF: fat_delete+7Cj
call is_obj_in_use
jnz cant_delete
dec dcnt
or dir_check_flag, 0Fh
mov dname_cluster, 0
call fat_dirent_next
or ax, ax
jz cant_delete
jmps fat_zap_dirent
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
target_is_file: ; CODE XREF: fat_delete+4Fj
call fs_nop2
fat_zap_dirent: ; CODE XREF: fat_delete+9Dj
mov bx, p_dirent
mov byte ptr [bx], 0E5h; Deleted
mov ax, 26[bx]
push bx
call fat_freechain ; Zap cluster chain
pop bx
call seek$copy
mov bx, offset user_fcb
call chk$wild_cpm
pop ax
jnz j_write_FAT
fat_del_skipf: ; CODE XREF: fat_delete+44j
push ax
jmp fat_del_dirloop
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_del_nxtfile: ; CODE XREF: fat_delete+18j
or ah, ah
jnz fat_del1_next
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_del1_next: ; CODE XREF: fat_delete+C3j
inc al
jmp fat_del1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
j_write_FAT: ; CODE XREF: fat_delete+9j
; fat_delete+BBj
jmp write_FAT
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
is_obj_in_use: ; CODE XREF: fat_delete+82p
cli
mov bx, p_dirent
mov dx, 26[bx]
mov si, bdos_conowner
ck_obj_in_use: ; CODE XREF: is_obj_in_use+3Dj
test si, si
jz ioiu_alldone
push ds
mov ds, si
mov di, proc_dirname
pop ds
test di, di
jz ioiu_nextproc ; No current dir structure
mov al, curdsk
mov cx, 10h
ioiu_chkdrive: ; CODE XREF: is_obj_in_use+33j
mov bx, [di]
test bx, bx
jz ioui_nextdrive
cmp al, [bx]
jnz ioui_nextdrive
cmp dx, 6[bx]
jz ioiu_driveinuse
ioui_nextdrive: ; CODE XREF: is_obj_in_use+26j
; is_obj_in_use+2Aj
inc di
inc di
loop ioiu_chkdrive
ioiu_nextproc: ; CODE XREF: is_obj_in_use+1Aj
push ds
mov ds, si
mov si, proc_nextseg
pop ds
jmps ck_obj_in_use
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ioiu_driveinuse: ; CODE XREF: is_obj_in_use+2Fj
inc dx
ioiu_alldone: ; CODE XREF: is_obj_in_use+Ej
sti
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
is_dir_empty: ; CODE XREF: fat_delete+6Bp
mov scan_dirent, cx
xor bx, bx
call clus_to_sec
call setdir1
mov dir_record, ax
shl ax, 1
shl ax, 1
mov dir_entries, ax
mov bx, dpb_clustersize
mov cl, 7
add cl, dpb_psh
shr bx, cl
idempty_loop: ; CODE XREF: is_dir_empty+64j
push bx
call seek
call rdbuff
pop bx
mov cx, scan_dirent
mov dx, dir_entries
sub dx, cx
mov si, word ptr fs_buffer+2
idempty_scanrec: ; CODE XREF: is_dir_empty+3Dj
jcxz idempty_offset0
add si, 20h
loop idempty_scanrec
idempty_offset0: ; CODE XREF: is_dir_empty+38j
mov scan_dirent, cx
scan_dirents: ; CODE XREF: is_dir_empty+52j
dec dx
jl dir_next_record
lodsb
cmp al, 0
jz dirent_blank
cmp al, 0E5h
jnz dirent_used
dirent_blank: ; CODE XREF: is_dir_empty+49j
add si, 1Fh
jmps scan_dirents
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dirent_used: ; CODE XREF: is_dir_empty+4Dj
xor ax, ax
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dir_next_record: ; CODE XREF: is_dir_empty+44j
mov ax, dir_record
add bcb_record, ax
adc bcb_record_h, 0
dec bx
jnz idempty_loop
inc bx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_rename: ; CODE XREF: bdos:479Aj
call copy$user$no
mov dl, 1
call check$wild0
mov ah, 9
jz rename_wild
call set$end$dir
mov cx, 1002h ; Does new name exist?
call fat_search1
or ax, ax
jz fat_rename2
mov ah, 8
rename_wild: ; CODE XREF: fat_rename+Aj
add fs_param_low, 10h
mov cur_fcb_len, 0
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rename2: ; CODE XREF: fat_rename+17j
call lookup_dirent
or ax, ax
jnz fat_rename3
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rename3: ; CODE XREF: fat_rename+2Dj
mov bx, ax
test byte ptr 11[bx], 10h
jz fat_rename4
jmp rof$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rename4: ; CODE XREF: fat_rename+38j
call fs_nop2
xor bx, bx
mov si, p_dirent
fat_rename5: ; CODE XREF: fat_rename+55j
cmp bl, 0Bh
jnb fat_rename6
mov al, user_fcb+11h[bx]
and al, 7Fh
mov [bx+si], al
inc bl
jmps fat_rename5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rename6: ; CODE XREF: fat_rename+49j
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
f_attrib_fat: ; CODE XREF: F_ATTRIB+10j
call lookup_dirent
or ax, ax
jnz f_attrib_fat1
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat1: ; CODE XREF: f_attrib_fat+5j
call get$atts
test al, 40h ; Set size
jz dont_set_size ; Not asked to set size
mov cl, user_fcb+20h
and cl, 7Fh
or cl, cl
jz dont_set_size ; Passed size is 0
mov bx, p_dirent
mov ax, 28[bx]
mov dx, 30[bx] ; DXAX = file size
or ax, ax
jnz f_attrib_fat2
or dx, dx
jz dont_set_size
f_attrib_fat2: ; CODE XREF: f_attrib_fat+28j
test al, 7Fh
jz f_attrib_fat3
and al, 80h
jmps f_attrib_fat4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat3: ; CODE XREF: f_attrib_fat+30j
sub ax, 80h
sbb dx, 0
f_attrib_fat4: ; CODE XREF: f_attrib_fat+34j
xor ch, ch
add ax, cx
adc dx, 0
mov 28[bx], ax
mov 30[bx], dx
dont_set_size: ; CODE XREF: f_attrib_fat+Fj
; f_attrib_fat+1Aj ...
call fs_nop2
xor bx, bx
mov si, p_dirent
set_attr_bits: ; CODE XREF: f_attrib_fat+9Cj
cmp bl, 0Bh
jnb f_attrib_fat12
mov ah, user_fcb+1[bx]
and ah, 80h
cmp bl, 4
jnb f_attrib_fat6
lea di, 12[si]
mov al, 80h
mov cl, bl
shr al, cl
jmps f_attrib_fat9
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat6: ; CODE XREF: f_attrib_fat+61j
cmp bl, 8
jb f_attrib_fat11
lea di, 11[si]
cmp bl, 8
jnz f_attrib_fat7
mov al, 1
jmps f_attrib_fat9
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat7: ; CODE XREF: f_attrib_fat+79j
cmp bl, 9
jnz f_attrib_fat8
mov al, 4
jmps f_attrib_fat9
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat8: ; CODE XREF: f_attrib_fat+82j
mov al, 20h
xor ah, 80h
f_attrib_fat9: ; CODE XREF: f_attrib_fat+6Cj
; f_attrib_fat+7Dj ...
test ah, 80h
jz f_attrib_fat10
or [di], al
jmps f_attrib_fat11
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat10: ; CODE XREF: f_attrib_fat+90j
not al
and [di], al
f_attrib_fat11: ; CODE XREF: f_attrib_fat+71j
; f_attrib_fat+94j
inc bl
jmps set_attr_bits
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
f_attrib_fat12: ; CODE XREF: f_attrib_fat+55j
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_truncate: ; CODE XREF: F_TRUNCATE+10j
call get$atts
test user_fcb+23h, 0FCh
jz fat_trunc_1
fat_trunc_fail: ; CODE XREF: fat_truncate+12j
; fat_truncate+3Bj ...
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_trunc_1: ; CODE XREF: fat_truncate+8j
call lookup_dirent
or ax, ax
jz fat_trunc_fail
call fs_nop2
mov si, p_dirent
test byte ptr 11[si], 11h
jz fat_trunc_2
jmp rof$error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_trunc_2: ; CODE XREF: fat_truncate+1Fj
mov ax, word ptr user_fcb+21h
mov dl, user_fcb+23h
xor dh, dh
mov cl, 7
call shl_dxax_cl
add ax, 80h
adc dx, 0
cmp dx, 30[si]
ja fat_trunc_fail
jb fat_trunc_3
cmp ax, 28[si]
jnb fat_trunc_fail
fat_trunc_3: ; CODE XREF: fat_truncate+3Dj
mov 28[si], ax
mov 30[si], dx
or byte ptr 11[si], 20h
sub ax, 1
sbb dx, 0
mov cx, dpb_clustersize
div cx
mov bx, 26[si]
or bx, bx
jnz fat_trunc_5
fat_trunc_4: ; CODE XREF: fat_truncate+68j
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_trunc_5: ; CODE XREF: fat_truncate+5Fj
; fat_truncate+78j
cmp bx, dpb_clusters
jnb fat_trunc_4
or ax, ax
jz fat_trunc_6
dec ax
push ax
mov ax, bx
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
mov bx, ax
pop ax
jmps fat_trunc_5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_trunc_6: ; CODE XREF: fat_truncate+6Cj
mov ax, bx
push bx
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
pop bx
cmp ax, dpb_clusters
jnb fat_trunc_7
push bx
call fat_freechain
pop ax
mov bx, max_cluster
call fat_wcluster ; Set cluster[AX] to BX
call write_FAT
fat_trunc_7: ; CODE XREF: fat_truncate+85j
call fat_today
call fat_set_date
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_timedate: ; CODE XREF: F_TIMEDATE+Dj
call lookup_dirent
or ax, ax
jnz fat_timedate1
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_timedate1: ; CODE XREF: fat_timedate+5j
mov di, offset user_fcb+0Ch
mov cx, 4
xor ax, ax
rep stosw
call fat_get_date
call dos_date_to_cpm
mov si, offset fs_days
mov di, offset user_fcb+14h
movsw
movsw
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_bdos_74: ; CODE XREF: F_BDOS_74+10j
call lookup_dirent
or ax, ax
jnz fat_setstamp_1
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_setstamp_1: ; CODE XREF: fat_bdos_74+5j
mov si, offset passwd_buf+4
mov di, offset fs_days
movsw
movsw
xor al, al
stosb
call timestamp_2_fat
call fat_set_date
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_size: ; CODE XREF: F_SIZE+7j
mov dx, 0FFFFh
push ax
push dx
call set$end$dir
fsize_next: ; CODE XREF: fat_size+2Cj
call fat_dirent_next
or ax, ax
jz fsize_nomatch
mov si, ax
pop dx
pop ax
cmp dx, 0FFFFh
;
; Take the size of the biggest matching file
;
jz fsize_gotsize
cmp dx, 30[si]
jb fsize_gotsize
ja fsize_haventgot
cmp ax, 28[si]
jnb fsize_haventgot
fsize_gotsize: ; CODE XREF: fat_size+16j fat_size+1Bj
mov ax, 28[si]
mov dx, 30[si]
fsize_haventgot: ; CODE XREF: fat_size+1Dj fat_size+22j
push ax
push dx
jmps fsize_next
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fsize_nomatch: ; CODE XREF: fat_size+Dj
pop dx
pop ax
cmp dx, 0FFFFh
jnz fsize_havesize
jmp lret$eq$ff
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fsize_havesize: ; CODE XREF: fat_size+33j
mov di, offset user_fcb+21h
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
size_to_records: ; CODE XREF: fat_space+28p
test al, 7Fh
jz s2r_noround
and al, 80h
add ax, 80h
adc dx, 0
s2r_noround: ; CODE XREF: size_to_records+2j
mov cx, 7
call shr_dxax_cl
mov es:[di], al
mov es:1[di], ah
mov es:2[di], dl
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; If FAT entry AX is unused, set it to EOF
fat_set_eof: ; CODE XREF: rd$subdir1+31p
; fat_make+2Ap ...
push ax
call fat_get ; Return FAT entry [AX]
pop bx
or ax, ax
jnz fat_set_eof_ret
mov ax, max_cluster
push ax
xchg ax, bx
call fat_wcluster ; Set cluster[AX] to BX
pop ax
fat_set_eof_ret: ; CODE XREF: fat_set_eof+7j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Return FAT entry [AX]
fat_get: ; CODE XREF: fat_set_eof+1p
; fat_freechain+Bp ...
mov di, ax
cmp max_cluster, 0FFFFh
jz fat_get1
shr di, 1
add di, ax
mov es, dph_hash
mov dx, es:[di]
test ax, 1
jz fat_get2
mov cl, 4
shr dx, cl
jmps fat_get3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_get1: ; CODE XREF: fat_get+7j
shl di, 1
mov es, dph_hash
mov dx, es:[di]
jmps fat_get3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_get2: ; CODE XREF: fat_get+17j
and dx, 0FFFh
fat_get3: ; CODE XREF: fat_get+1Dj fat_get+28j
mov ax, ds
mov es, ax
mov ax, dx
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; Set cluster[AX] to BX
fat_wcluster: ; CODE XREF: fat_make+45p fat_make+4Fp
; ...
mov di, ax
cmp max_cluster, 0FFFFh
jz fat_wcluster16
shr di, 1
add di, ax
test ax, 1
jz fat_wcluster12a
mov cl, 4
shl bx, cl
mov ax, 0Fh
jmps fat_wcluster12
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_wcluster16: ; CODE XREF: fat_wcluster+7j
shl di, 1
mov es, dph_hash
mov es:[di], bx
jmps fat_wcls_end
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_wcluster12a: ; CODE XREF: fat_wcluster+10j
mov ax, 0F000h
fat_wcluster12: ; CODE XREF: fat_wcluster+19j
mov es, dph_hash
and es:[di], ax
or es:[di], bx
fat_wcls_end: ; CODE XREF: fat_wcluster+24j
mov ax, ds
mov es, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_freechain: ; CODE XREF: fat_delete+ADp
; fat_truncate+88p ...
or ax, ax
jz fat_fc_done
cmp ax, dpb_clusters
jnb fat_fc_done
push ax
call fat_get ; Return FAT entry [AX]
pop bx
push ax
mov ax, bx
xor bx, bx
call fat_wcluster ; Set cluster[AX] to BX
pop ax
jmps fat_freechain
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_fc_done: ; CODE XREF: fat_freechain+2j
; fat_freechain+8j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_space: ; CODE XREF: DRV_SPACE+Aj
xor cx, cx
mov ax, 2
fatspace_count: ; CODE XREF: fat_space+18j
cmp ax, dpb_clusters
jnb fatspace_done
push ax
push cx
call fat_get ; Return FAT entry [AX]
pop cx
or ax, ax
jnz fatspace_used
inc cx
fatspace_used: ; CODE XREF: fat_space+13j
pop ax
inc ax
jmps fatspace_count
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fatspace_done: ; CODE XREF: fat_space+9j
mov ax, cx
mul dpb_clustersize
mov es, userdmaseg
mov di, userdma
call size_to_records
mov ax, ds
mov es, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
; CL: Bit 0=1 for read, 0 for write
; Bit 1=1 for rand, 0 for seq
fat_rdwr: ; CODE XREF: F_READ+Cj F_WRITE+Cj
; ...
mov attributes, 0 ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
mov fat_rdwr_flg1, 0
mov fat_rdwr_op, cl
test cl, 1
jnz fat_rdwr2
mov ah, 3
test high$ext, 40h
jz fat_rdwr1
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr1: ; CODE XREF: fat_rdwr+1Aj
mov bx, offset user_fcb
call check$rofile
call check$write
or user_fcb+0Eh, 40h
fat_rdwr2: ; CODE XREF: fat_rdwr+11j
test fat_rdwr_op, 2
jz fat_rdwr5
test user_fcb+23h, 0FCh
jz fat_rdwr3
mov byte ptr aret, 6
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr3: ; CODE XREF: fat_rdwr+39j
call calc_extent_no
mov ah, user_fcb+0Eh
and ah, 3Fh
cmp ah, ch
jnz fat_rdwr4
cmp cl, user_fcb+0Ch
jz fat_rdwr7
fat_rdwr4: ; CODE XREF: fat_rdwr+4Dj
mov fat_rdwr_flg1, 0FFh
jmps fat_rdwr7
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr5: ; CODE XREF: fat_rdwr+32j
mov ch, user_fcb+0Eh
and ch, 3Fh
mov cl, user_fcb+0Ch
mov dl, user_fcb+20h
cmp dl, 80h
jb fat_rdwr7
cmp cl, 1Fh
jnz fat_rdwr6
cmp ch, 3Fh
jnz fat_rdwr6
mov byte ptr aret, 1
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr6: ; CODE XREF: fat_rdwr+73j fat_rdwr+78j
mov fat_rdwr_flg1, 0FFh
xor dl, dl
inc cl
cmp cl, 20h
jnz fat_rdwr7
xor cl, cl
inc ch
fat_rdwr7: ; CODE XREF: fat_rdwr+53j fat_rdwr+5Aj
; ...
mov c2f_S2, ch
mov c2f_EX, cl
mov c2f_RC, dl
xor ax, ax
mov ah, dl
shr ax, 1
xor bx, bx
mov bh, cl
mov cl, 2
shr bx, cl
or ah, bl
xor dx, dx
mov dl, ch
mov cl, 3
shl dx, cl
or dl, bh
mov word ptr fat_file_ptr, ax
mov word ptr fat_file_ptr+2, dx
cmp fs_function, 16h
jbe fat_rdwr8
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr8: ; CODE XREF: fat_rdwr+C4j
mov bx, dx
mov cx, dpb_clustersize
call fat_muldiv
or dx, dx
jnz fat_rdwr9
inc ax
cmp ax, dpb_clusters
jb fat_rdwr11
fat_rdwr9: ; CODE XREF: fat_rdwr+D2j
mov al, 2
test fat_rdwr_op, 1
jz fat_rdwr10
dec al
fat_rdwr10: ; CODE XREF: fat_rdwr+E2j
mov byte ptr aret, al
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr11: ; CODE XREF: fat_rdwr+D9j
dec ax
mov dir_record, ax
mov dir_entries, cx
mov dx, word ptr user_fcb+16h
mov ax, dir_record
cmp ax, dx
jnz fat_rdwr12
cmp word ptr user_fcb+14h, 0
jz fat_rdwr12
jmp fat_rdwr28
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr12: ; CODE XREF: fat_rdwr+FBj fat_rdwr+102j
mov open_unknown, 0FFh
cmp ax, dx
jb fat_rdwr13
cmp word ptr user_fcb+14h, 0
jz fat_rdwr13
sub ax, dx
mov scan_dirent, ax
mov ax, word ptr user_fcb+14h
mov nearby_cluster, ax
mov word_A15_7B1, ax
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
mov newdir_cluster, ax
jmps fat_rdwr16
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr13: ; CODE XREF: fat_rdwr+10Ej
; fat_rdwr+115j
mov word ptr user_fcb+14h, 0
inc ax
mov scan_dirent, ax
mov ax, word ptr user_fcb+1Ah
mov newdir_cluster, ax
or ax, ax
jnz fat_rdwr14
call fat_getfsize
mov ax, word ptr user_fcb+1Ah
mov newdir_cluster, ax
fat_rdwr14: ; CODE XREF: fat_rdwr+13Fj
or ax, ax
jnz fat_rdwr15
mov attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
fat_rdwr15: ; CODE XREF: fat_rdwr+14Cj
mov nearby_cluster, 0
mov word_A15_7B1, 0
fat_rdwr16: ; CODE XREF: fat_rdwr+12Bj
; fat_rdwr+209j
test scan_dirent, 0FFFFh
jnz fat_rdwr17
jmp fat_rdwr27
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr17: ; CODE XREF: fat_rdwr+165j
dec scan_dirent
mov ax, newdir_cluster
or ax, ax
jz fat_rdwr18
cmp ax, dpb_clusters
jnb fat_rdwr18
jmp fat_rdwr25
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr18: ; CODE XREF: fat_rdwr+173j
; fat_rdwr+179j
test fat_rdwr_op, 1
jz fat_rdwr19
jmp f_ret_1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr19: ; CODE XREF: fat_rdwr+183j
mov ax, nearby_cluster
call alloc_cluster
or ax, ax
jz fat_rdwr22
mov newdir_cluster, ax
mov bx, ax
and user_fcb+0Eh, 7Fh
mov ax, nearby_cluster
or ax, ax
jz fat_rdwr20
call fat_wcluster ; Set cluster[AX] to BX
jmps fat_rdwr21
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr20: ; CODE XREF: fat_rdwr+1A1j
mov word ptr user_fcb+1Ah, bx
fat_rdwr21: ; CODE XREF: fat_rdwr+1A6j
mov ax, newdir_cluster
mov bx, max_cluster
call fat_wcluster ; Set cluster[AX] to BX
cmp fs_function, 16h
jnz fat_rdwr26
mov ax, newdir_cluster
call wr_cluster
jmp fat_rdwr26
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr22: ; CODE XREF: fat_rdwr+190j
mov ax, word_A15_7B1
or ax, ax
jz fat_rdwr23
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
cmp ax, dpb_clusters
jnb fat_rdwr24
call fat_freechain
mov ax, word_A15_7B1
mov bx, max_cluster
call fat_wcluster ; Set cluster[AX] to BX
jmps fat_rdwr24
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr23: ; CODE XREF: fat_rdwr+1CBj
mov ax, word ptr user_fcb+1Ah
call fat_freechain
mov word ptr user_fcb+1Ah, 0
fat_rdwr24: ; CODE XREF: fat_rdwr+1D4j
; fat_rdwr+1E3j
mov byte ptr aret, 2
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr25: ; CODE XREF: fat_rdwr+17Bj
mov ax, newdir_cluster
mov word_A15_7B1, ax
fat_rdwr26: ; CODE XREF: fat_rdwr+1BBj
; fat_rdwr+1C3j
mov ax, newdir_cluster
mov nearby_cluster, ax
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
mov newdir_cluster, ax
jmp fat_rdwr16
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr27: ; CODE XREF: fat_rdwr+167j
mov ax, nearby_cluster
mov word ptr user_fcb+14h, ax
mov ax, dir_record
mov word ptr user_fcb+16h, ax
jmps fat_rdwr29
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr28: ; CODE XREF: fat_rdwr+104j
mov ax, word ptr user_fcb+14h
mov nearby_cluster, ax
fat_rdwr29: ; CODE XREF: fat_rdwr+218j
; fat_rdwr+241j
xor ch, ch
mov ax, word ptr fat_file_ptr+2
cmp ax, word ptr user_fcb+1Eh
ja fat_rdwr30
jb fat_rdwr31
mov ax, word ptr fat_file_ptr
cmp ax, word ptr user_fcb+1Ch
jb fat_rdwr31
fat_rdwr30: ; CODE XREF: fat_rdwr+229j
mov ch, 0FFh
fat_rdwr31: ; CODE XREF: fat_rdwr+22Bj
; fat_rdwr+234j
or ch, ch
jz fat_rdwr32
call fat_getfsize
or ax, ax
jnz fat_rdwr29
mov ch, 0FFh
fat_rdwr32: ; CODE XREF: fat_rdwr+23Aj
test fat_rdwr_op, 1
jnz fat_rdwr35
cmp fs_function, 16h
jz fat_rdwr34
or ch, ch
jz fat_rdwr34
mov al, dpb_phm
xor ah, ah
mov cl, 7
shl ax, cl
test word ptr fat_file_ptr, ax
jz fat_rdwr33
mov ax, word ptr fat_file_ptr
mov dx, word ptr fat_file_ptr+2
mov cl, dpb_psh
add cl, 7
push cx
call shr_dxax_cl
pop cx
push ax
push dx
mov ax, word ptr user_fcb+1Ch
mov dx, word ptr user_fcb+1Eh
call shr_dxax_cl
pop cx
pop bx
sub bx, ax
sbb cx, dx
or bx, cx
jz fat_rdwr34
fat_rdwr33: ; CODE XREF: fat_rdwr+264j
mov fat_deblock?, 0
jmps fat_rdwr36
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr34: ; CODE XREF: fat_rdwr+251j
; fat_rdwr+255j ...
mov fat_deblock?, 0FFh
jmps fat_rdwr36
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr35: ; CODE XREF: fat_rdwr+24Aj
or ch, ch
jz fat_rdwr36
jmp f_ret_1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr36: ; CODE XREF: fat_rdwr+294j
; fat_rdwr+29Bj ...
mov ax, nearby_cluster
mov bx, dir_entries
call clus_to_sec
call fat_rdwr_sub1
cmp ax, 0FFFFh
jz fat_rdwr37
call fat_rdwr_ckd
jmps fat_rdwr39
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr37: ; CODE XREF: fat_rdwr+2B4j
test fat_rdwr_op, 1
jnz fat_rdwr39
test dpb_phm, 0FFh
jz fat_rdwr38
mov al, byte ptr bcb_record
test dpb_phm, al
jnz fat_rdwr39
fat_rdwr38: ; CODE XREF: fat_rdwr+2C7j
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
fat_rdwr39: ; CODE XREF: fat_rdwr+2B9j
; fat_rdwr+2C0j ...
add word ptr fat_file_ptr, 80h
adc word ptr fat_file_ptr+2, 0
fat_rdwr40: ; CODE XREF: fat_rdwr+2F9j
mov ax, word ptr fat_file_ptr+2
cmp ax, word ptr user_fcb+1Eh
ja fat_rdwr41
jb fat_rdwr43
mov ax, word ptr fat_file_ptr
cmp ax, word ptr user_fcb+1Ch
jbe fat_rdwr43
fat_rdwr41: ; CODE XREF: fat_rdwr+2E7j
call fat_getfsize
or ax, ax
jnz fat_rdwr40
test fat_rdwr_op, 1
jz fat_rdwr42
mov ax, word ptr fat_file_ptr+2
sub ax, word ptr user_fcb+1Eh
mov ax, word ptr fat_file_ptr
sbb ax, word ptr user_fcb+1Ch
mov bx, 80h
sub bx, ax
mov di, userdma
add di, bx
mov es, userdmaseg
mov cx, ax
xor al, al
rep stosb
mov ax, ds
mov es, ax
jmps fat_rdwr43
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr42: ; CODE XREF: fat_rdwr+300j
mov ax, word ptr fat_file_ptr
mov word ptr user_fcb+1Ch, ax
mov fat_rdwr_flg1, 0FFh
mov ax, word ptr fat_file_ptr+2
mov word ptr user_fcb+1Eh, ax
mov open_unknown, 0FFh
call fat_rw_u
fat_rdwr43: ; CODE XREF: fat_rdwr+2E9j
; fat_rdwr+2F2j ...
mov al, user_fcb+0Eh
and al, 0C0h
or al, c2f_S2
mov user_fcb+0Eh, al
mov al, c2f_EX
mov user_fcb+0Ch, al
mov al, c2f_RC
mov user_fcb+20h, al
test fat_rdwr_flg1, 0FFh
jz fat_rdwr46
call c2f_to_extent
cmp ax, 0FFFFh
jnz fat_rdwr44
xor al, al
jmps fat_rdwr45
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr44: ; CODE XREF: fat_rdwr+369j
mov cl, 7
shr ax, cl
fat_rdwr45: ; CODE XREF: fat_rdwr+36Dj
mov user_fcb+0Fh, al
fat_rdwr46: ; CODE XREF: fat_rdwr+361j
test fat_rdwr_op, 2
jnz fat_rdwr47
inc user_fcb+20h
fat_rdwr47: ; CODE XREF: fat_rdwr+37Bj
test attributes, 80h ; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
jz fat_rdwr48
call fat_close
cmp byte ptr aret, 0FFh
jnz fat_rdwr48
mov ah, 0Ah
jmp disk_error
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr48: ; CODE XREF: fat_rdwr+386j
; fat_rdwr+390j
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_rdwr_sub1: ; CODE XREF: fat_rdwr+2AEp
cmp dir$cnt, 1
jbe fat_rdwr_sub2
dec dir$cnt
mov ax, 0FFFFh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr_sub2: ; CODE XREF: fat_rdwr_sub1+5j
mov al, dpb_phm
and al, byte ptr bcb_record
jnz fat_rdwr_sub3
cmp last_sec_count, 2
jb fat_rdwr_sub3
test high$ext, 80h
jnz fat_rdwr_sub3
cmp fs_function, 16h
jnz fat_rdwr_sub5
fat_rdwr_sub3: ; CODE XREF: fat_rdwr_sub1+16j
; fat_rdwr_sub1+1Dj ...
xor ax, ax
test dpb_phm, 0FFh
jnz fat_rdwr_sub4
mov al, 1
fat_rdwr_sub4: ; CODE XREF: fat_rdwr_sub1+34j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr_sub5: ; CODE XREF: fat_rdwr_sub1+2Bj
mov ax, nearby_cluster
xor cx, cx
fat_rdwr_sub6: ; CODE XREF: fat_rdwr_sub1+4Bj
push ax
push cx
call fat_set_eof ; If FAT entry AX is unused, set it to EOF
pop cx
pop bx
inc bx
cmp ax, bx
jnz fat_rdwr_sub7
inc cx
jmps fat_rdwr_sub6
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr_sub7: ; CODE XREF: fat_rdwr_sub1+48j
test fat_rdwr_op, 1
jnz fat_rdwr_sub9
cmp ax, 0FF7h
jbe fat_rdwr_sub9
fat_rdwr_sub8: ; CODE XREF: fat_rdwr_sub1+6Ej
push bx
push cx
mov ax, bx
call fat_get ; Return FAT entry [AX]
pop cx
pop bx
or ax, ax
jnz fat_rdwr_sub9
cmp bx, dpb_clusters
jnb fat_rdwr_sub9
inc bx
inc cx
jmps fat_rdwr_sub8
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr_sub9: ; CODE XREF: fat_rdwr_sub1+52j
; fat_rdwr_sub1+57j ...
mov ax, dpb_clustersize
mul cx
mov bx, dpb_clustersize
sub bx, dir_entries
add ax, bx
adc dx, 0
or dx, dx
jnz fat_rdwr_sub10
cmp ax, 4000h
jb fat_rdwr_sub11
fat_rdwr_sub10: ; CODE XREF: fat_rdwr_sub1+84j
mov ax, 4000h
xor dx, dx
fat_rdwr_sub11: ; CODE XREF: fat_rdwr_sub1+89j
test fat_rdwr_op, 1
jz fat_rdwr_sub14
mov bx, word ptr user_fcb+1Ch
sub bx, word ptr fat_file_ptr
mov cx, word ptr user_fcb+1Eh
sbb cx, word ptr fat_file_ptr+2
jnb fat_rdwr_sub12
xor bx, bx
xor cx, cx
fat_rdwr_sub12: ; CODE XREF: fat_rdwr_sub1+A7j
cmp cx, dx
ja fat_rdwr_sub14
jb fat_rdwr_sub13
cmp bx, ax
jnb fat_rdwr_sub14
fat_rdwr_sub13: ; CODE XREF: fat_rdwr_sub1+B1j
mov ax, bx
mov dx, cx
fat_rdwr_sub14: ; CODE XREF: fat_rdwr_sub1+95j
; fat_rdwr_sub1+AFj ...
mov cl, 7
call shr_dxax_cl
cmp al, last_sec_count
jbe fat_rdwr_sub15
mov al, last_sec_count
fat_rdwr_sub15: ; CODE XREF: fat_rdwr_sub1+C4j
mov bl, al
mov cl, dpb_psh
shr al, cl
mov dl, dpb_phm
not dl
and bl, dl
mov dir$cnt, bl
push ax
or al, al
jz fat_rdwr_sub16
test fat_rdwr_op, 1
jz fat_rdwr_sub16
call flushx
fat_rdwr_sub16: ; CODE XREF: fat_rdwr_sub1+E0j
; fat_rdwr_sub1+E7j
pop ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
alloc_cluster: ; CODE XREF: fat_make+36p fat_make+AAp
; ...
or ax, ax
jnz alloc_clus_1
mov ax, 1
alloc_clus_1: ; CODE XREF: alloc_cluster+2j
mov bx, ax
inc bx
dec ax
alloc_clus_2: ; CODE XREF: alloc_cluster+37j
; alloc_cluster+3Dj
cmp bx, dpb_clusters
jnb alloc_clus_4
push ax
push bx
mov ax, bx
call fat_get ; Return FAT entry [AX]
pop bx
or ax, ax
pop ax
jnz alloc_clus_3
mov ax, bx
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
alloc_clus_3: ; CODE XREF: alloc_cluster+1Cj
inc bx
alloc_clus_4: ; CODE XREF: alloc_cluster+Fj
cmp ax, 2
jbe alloc_clus_6
push ax
push bx
call fat_get ; Return FAT entry [AX]
pop bx
or ax, ax
pop ax
jnz alloc_clus_5
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
alloc_clus_5: ; CODE XREF: alloc_cluster+30j
dec ax
alloc_clus_6: ; CODE XREF: alloc_cluster+25j
cmp ax, 2
ja alloc_clus_2
cmp bx, dpb_clusters
jb alloc_clus_2
xor ax, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_rdwr_ckd: ; CODE XREF: fat_rdwr+2B6p
mov cl, fat_rdwr_op
and cl, 1
or ax, ax
jz fat_rdwr_ckd2
or cl, cl
jnz fat_rdwr_ckd1
push ax
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
pop ax
xor cl, cl
fat_rdwr_ckd1: ; CODE XREF: fat_rdwr_ckd+Dj
jmp recordok1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rdwr_ckd2: ; CODE XREF: fat_rdwr_ckd+9j
mov ch, fat_deblock?
jmp ddta_1
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
clus_to_sec: ; CODE XREF: rd$subdir1+69p
; fat_make+D6p ...
dec ax
dec ax
mul dpb_clustersize
add ax, bx
adc dx, 0
mov cl, 7
call shr_dxax_cl
mov bx, dpb_drm
add bx, 4
mov cl, 2
shr bx, cl
test dpb_phm, bl
jz clus_to_sec1
mov cl, dpb_phm
xor ch, ch
not cx
and bx, cx
not cx
add bx, cx
inc bx
clus_to_sec1: ; CODE XREF: clus_to_sec+1Fj
add ax, bx
adc dx, 0
mov byte ptr bcb_record, al
mov byte ptr bcb_record+1, ah
mov bcb_record_h, dl
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
wr_cluster: ; CODE XREF: fat_make+58p fat_make+CEp
; ...
xor bx, bx
call clus_to_sec
call setdir1
mov bx, dpb_clustersize
mov cl, 7
add cl, dpb_psh
shr bx, cl
mov fat_deblock?, 0
wr_cluster_loop: ; CODE XREF: wr_cluster+32j
push ax
push bx
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
call seek
xor cl, cl
call wrbuff
pop bx
pop ax
add bcb_record, ax
adc bcb_record_h, 0
dec bx
jnz wr_cluster_loop
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_getfsize: ; CODE XREF: fat_rdwr+141p
; fat_rdwr+23Cp ...
or dir_check_flag, 0Fh
test high$ext, 80h
jz fat_getfsize4
cmp fs_sectorcount, 1
jbe fat_getfsize1
mov al, last_sec_count
cmp al, fs_sectorcount
jnz fat_getfsize4
fat_getfsize1: ; CODE XREF: fat_getfsize+11j
mov al, user_fcb+12h
mov ah, user_fcb+10h
and ah, 1Fh
dec ax
mov dcnt, ax
call fat_dirent_next
or ax, ax
jnz fat_getfsize2
pop bx
mov byte ptr aret, 0Bh
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_getfsize2: ; CODE XREF: fat_getfsize+2Fj
mov open_unknown, 0FFh
mov bx, ax
mov ax, 26[bx]
mov word ptr user_fcb+1Ah, ax
mov dx, 30[bx]
cmp word ptr user_fcb+1Eh, dx
ja fat_getfsize4
jb fat_getfsize3
mov ax, 28[bx]
cmp word ptr user_fcb+1Ch, ax
jnb fat_getfsize4
fat_getfsize3: ; CODE XREF: fat_getfsize+4Ej
mov word ptr user_fcb+1Ch, ax
mov word ptr user_fcb+1Eh, dx
mov fat_rdwr_flg1, 0FFh
mov al, 1
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_getfsize4: ; CODE XREF: fat_getfsize+Aj
; fat_getfsize+1Aj ...
xor ax, ax
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_rw_u: ; CODE XREF: fat_rdwr+341p
cmp fs_sectorcount, 1
ja fat_rw_u3
test high$ext, 80h
jz fat_rw_u3
mov dir_check_flag, 0Fh
test dpb_cks+1, 50h
jnz fat_rw_u1
mov dir_check_flag, 0FFh
fat_rw_u1: ; CODE XREF: fat_rw_u+19j
call lookup_dirent
or ax, ax
jz fat_rw_u2
jmps fat_wr_dirent
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
fat_rw_u2: ; CODE XREF: fat_rw_u+25j
mov byte ptr aret, 0Bh
add sp, 2
fat_rw_u3: ; CODE XREF: fat_rw_u+5j fat_rw_u+Cj
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fat_wr_dirent: ; CODE XREF: fat_close+40p
; fat_rw_u+27j
mov bx, p_dirent
test word ptr 26[bx], 0FFFFh
jnz fat_wr_dirent1
mov ax, word ptr user_fcb+1Ah
mov 26[bx], ax
fat_wr_dirent1: ; CODE XREF: fat_wr_dirent+9j
mov ax, word ptr user_fcb+1Ch
mov dx, word ptr user_fcb+1Eh
cmp dx, 30[bx]
ja fat_wr_dirent2
jb fat_wr_dirent3
cmp ax, 28[bx]
jbe fat_wr_dirent3
fat_wr_dirent2: ; CODE XREF: fat_wr_dirent+1Bj
mov 28[bx], ax
mov 30[bx], dx
fat_wr_dirent3: ; CODE XREF: fat_wr_dirent+1Dj
; fat_wr_dirent+22j
or byte ptr 11[bx], 20h; Archive bit
and user_fcb+0Bh, 7Fh
jmp seek$copy
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
fs_nop2: ; CODE XREF: fat_delete+9Fp
; fat_rename+3Dp ...
retn
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
get_cwd_cluster: ; CODE XREF: fat_search1+28p
; fat_open+Cp ...
mov ax, cur_drvdir
test ax, ax
jz cwd_hasnt_clust
xchg ax, bx
mov ax, 6[bx] ; Cluster
or ax, ax
cwd_hasnt_clust: ; CODE XREF: get_cwd_cluster+5j
retn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
if DONTWRITE_PATCH
patch_dontwrite: ; CODE XREF: cpm_writerec+114j
mov cl, blk$off
call lru_ckdirty ; Returns Carry set if buffer dirty?
call discard$databcb ; Release the BCB for bcb_drive, record bcb_record
jmp dont$write1
else
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
endif
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Patch to "Read-only disk" error
;
if ROD_ERROR_PATCH
rod_err_patch: ; CODE XREF: bdos:2920j
mov bx, dph_dtabcb
test bx, bx
jz true_rod_err
mov bx, [bx]
bcb_discard: ; CODE XREF: bdos:6193j
mov al, bcb_drive
cmp al, [bx]
jnz bcb_discard_nxt ; Not for this drive
mov ax, rlr
cmp ax, 14[bx]
jnz bcb_discard_nxt ; Not for this process
sub ax, ax ; Dump BCB contents hard on the floor
mov 14[bx], ax
mov 4[bx], al
dec ax
mov [bx], al
bcb_discard_nxt: ; CODE XREF: bdos:6179j bdos:6181j
mov bx, 12[bx]
test bx, bx
jnz bcb_discard
true_rod_err: ; CODE XREF: bdos:6170j
mov ah, 2
jmp goerr
else ;ROD_ERROR_PATCH
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
endif
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
nop ; Code segment patch space
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dseg
public dirname_0
public dirname_1
public dirdata_0
public readonly_vector
public login_vector
removable_drive dw 0 ; DATA XREF: check_changed+5r
; media$change+Fo ...
dw 0,0
readonly_vector dw 0 ; DATA XREF: DRV_ROVECr nowriter
; ...
login_vector dw 0 ; DATA XREF: DRV_LOGINVECr
; rdbuff+28r ...
db 0
fcbdsk db 0 ; DATA XREF: funcs_F_main+6Eo
; F_do_call+51r ...
cur_fcb_len db 0 ; DATA XREF: funcs_F_main+ADr
; copy_fcb_36+2w ...
aret dw 0 ; DATA XREF: funcs_F_main+F3r
; F_repeat_call+1Ar ...
set_if_attrs db 0 ; DATA XREF: funcs_F_main+113r
; F_do_call+2Br ...
dir_check_flag db 0 ; DATA XREF: deblock+B2w rd$subdir1+50r
; ...
open_unknown db 0 ; DATA XREF: open$reel+74w
; openx+90w ...
search$user0 db 0 ; DATA XREF: bdos:371Cw bdos:374Er
; ...
make$xfcb db 0 ; DATA XREF: make+22r F_MAKE+9Ew
; ...
find$xfcb db 0 ; DATA XREF: search$h_sub+46r
; searchn+4Ar ...
xdcnt dw 0 ; DATA XREF: set_dcnt_dblkr
; search$h_sub+58w ...
dir$cnt db 0 ; DATA XREF: check$nprs+4r
; check$nprs+Dw ...
last_sec_count db 0 ; DATA XREF: F_repeat_call+Bw
; check$nprs+29r ...
readf$sw db 0 ; DATA XREF: rdbuff+Bw rdbuff+4Fr
err_major db 0 ; DATA XREF: funcs_F_main+104r
; errorw
relog db 0 ; DATA XREF: tst$relog+2w rdbuff+44w
; ...
fcb_is_for_dir db 0 ; DATA XREF: funcs_F_main+C2r
; F_do_call+17w ...
dw 0
fs_rdwrcount db 1 ; DATA XREF: xios_rdwr+Ew bdos:2C56w
; ...
blk$off db 0 ; DATA XREF: atran+1Dw deblock+11Ar
; ...
arecord1 dw 0 ; DATA XREF: atran+7w lru_ckdirty+14r
p_lru_first dw offset lru_1 ; DATA XREF: lru_toucho lru_touch+1Ew
; ...
lru_1 dw offset lru_2 ; DATA XREF: dseg:05E7o
dw 0
dw 0FFh
lru_2 dw offset lru_3 ; DATA XREF: dseg:05E9o
dw 0
dw 0FFh
lru_3 dw offset lru_4 ; DATA XREF: dseg:05EFo
dw 0
dw 0FFh
lru_4 dw offset lru_5 ; DATA XREF: dseg:05F5o
dw 0
dw 0FFh
lru_5 dw offset lru_6 ; DATA XREF: dseg:05FBo
dw 0
dw 0FFh
lru_6 dw 0 ; DATA XREF: dseg:0601o
dw 0
dw 0FFh
hash rb 4 ; DATA XREF: get$hash+3w get$hash+Cw
; ...
hashl db 0 ; DATA XREF: media$change+Cw
; set$hash+16w ...
deblock_command db 0 ; DATA XREF: deblock+76w deblock+A9r
; ...
phy$off db 0 ; DATA XREF: get$bcba+6Cr get$bcba+EEr
; ...
curbcba dw 0 ; DATA XREF: get$bcba+53w get$bcba+5Fr
; ...
rootbcba dw 0 ; DATA XREF: get$bcbaw get$bcba+DBr
; ...
emptybcba dw 0 ; DATA XREF: get$bcba+16w get$bcba+2Br
; ...
seqbcba dw 0 ; DATA XREF: get$bcba+19w get$bcba+4Fw
; ...
my_bcbs db 0 ; DATA XREF: get$bcba+1Cw get$bcba+4Bw
; ...
; BCBs owned by this process
fs_function db 0 ; DATA XREF: bdos:25EBr funcs_F_main+14w
; ...
fs_track dw 0 ; DATA XREF: xios_rdwr+13r
; seek+40w ...
fs_sector dw 0 ; DATA XREF: xios_rdwr+17r
; seek+43w ...
fs_param_low dw 0 ; DATA XREF: bdos:25FFr funcs_F_main+73w
; ...
searcha dw 0 ; DATA XREF: searchi+3w searchn+14r
; ...
fs_fcbdrive db 0 ; DATA XREF: funcs_F_main+30w
; error+4r ...
usrcode db 0 ; DATA XREF: reselect+40r F_OPEN+2Cr
; ...
fs_param_ds dw 0 ; DATA XREF: funcs_F_main+37w
; funcs_F_main+BCr ...
f_ret_es dw 0 ; DATA XREF: funcs_F_main+3Ew
; funcs_F_main+ECr ...
userdma dw 0 ; DATA XREF: funcs_F_main+4Eo
; funcs_F_main+58r ...
userdmaseg dw 0 ; DATA XREF: funcs_F_main+5Fw
; deblock+171r ...
sys_fx db 0 ; DATA XREF: funcs_F_main+E1o
searchl db 0 ; DATA XREF: search$hash+7r
; searchi+Cw ...
sys_find1st dw 0,0 ; DATA XREF: F_SFIRST+9w bdos:461Cr
; ...
dcnt dw 0 ; DATA XREF: end$of$diro set$end$dirw
; ...
ff2c_extent dw 0 ; DATA XREF: srch_fat+7w srch_fat+22w
; ...
fs_errormode db 0 ; DATA XREF: sel$error+Cr disk_error+Cr
; ...
fs_sectorcount db 0 ; DATA XREF: funcs_F_main+97r
; F_repeat_call+8r ...
df$password rb 8 ; DATA XREF: cmp$pw+36o F_PASSWD+Fo
; Default password
high$ext db 0 ; DATA XREF: F_do_call+3Br
; chek$fcbr ...
xfcb_rdonly db 0 ; DATA XREF: F_do_call+32r
; cpm_writerec+Fr ...
curdsk db 0FFh ; DATA XREF: xios_rdwr+8r sel$errorw
; ...
cdrmaxa dw 0 ; DATA XREF: compcdr+4r cpm_login+3Br
; ...
lsn$add dw 0 ; DATA XREF: chek$fcb+Cr set$lsnr
; ...
buffa dw 0 ; DATA XREF: compute$csr getdptra+6r
; ...
dph_dpb dw 0 ; DATA XREF: drive_login+1Eo
; drive_login+26r ...
dph_csv dw 0 ; DATA XREF: r$dir+50r
dph_alv dw 0 ; DATA XREF: getallocbit+Dr
; copy$alv+Br ...
dph_dirbcb dw 0 ; DATA XREF: discard$dirr deblock+4r
; ...
dph_dtabcb dw 0 ; DATA XREF: discard$databcbr
; deblock+13r ...
dph_hash dw 0 ; DATA XREF: set$hashr search$hashr
; ...
dpb_fatcount dw 0 ; DATA XREF: seek+26r drive_login+43o
; ...
dpb_secperfat dw 0 ; DATA XREF: seek+29r load_fats+16r
; ...
dpb_clusters dw 0 ; DATA XREF: rd$subdir1+35r
; fat_make+23r ...
dpb_clustersize dw 0 ; DATA XREF: rd$subdir1+15r
; drive_login+59r ...
dpb_firstfat dw 0 ; DATA XREF: seek+1Er load_fatsr
; ...
dpb_spt dw 0 ; DATA XREF: seek+32r seek+38r
; ...
dpb_bsh db 0 ; DATA XREF: atranr dm$positionr
; ...
dpb_blm db 0 ; DATA XREF: atran+19r check$nprs+53r
; ...
dpb_exm db 0 ; DATA XREF: get$dir$ext+2Br
; compext+1r ...
dpb_dsm dw 0 ; DATA XREF: get$nalbsr scandm$a+37r
; ...
dpb_drm dw 0 ; DATA XREF: r$dirr search$hash+1Fr
; ...
dpb_al0_al1 dw 0 ; DATA XREF: scandm$a+16r cpm_login+25r
dpb_cks dw 0 ; DATA XREF: rdbuff+20r r$dir+3Dr
; ...
dpb_off dw 0 ; DATA XREF: seek+3Cr
dpb_psh db 0 ; DATA XREF: seek+9r check$nprs+104r
; ...
dpb_phm db 0 ; DATA XREF: get$bcba+92r lru_ckdirty+29r
; ...
fat_buf_dirty? db 0 ; DATA XREF: lru_ckdirty+7r
; bdos:2EFAw
db 0
F_isfatfs db 0 ; DATA XREF: seek+17r lru_ckdirtyr
; ...
passwd_buf rb 10h
; cmp$pw+21o ...
open_G01 db 0 ; DATA XREF: cpm_opendir+18Bw
; fat_make+162r
result_F0F db 0 ; DATA XREF: F_do_call+4Br
; make+60w
save$xfcb db 0 ; DATA XREF: searchn+37w searchn+51w
; ...
openreel_S2 db 0 ; DATA XREF: open$reel+3w open$reel+66r
pw$mode db 0 ; DATA XREF: chk$pw$error+24w
; chk$pw$error+33o ...
; Password mode
attributes db 0 ; DATA XREF: get$atts+17w cpm_delete+16r
; ...
; Bit 7 set: F5'
; Bit 6 set: F6'
; Bit 5 set: F7'
; Bit 4 set: F8'
rb 4
rmf db 0 ; DATA XREF: open$reel+44r
; open$reel+90r ...
; Read mode flag
deblock_flag db 0 ; DATA XREF: cpm_writerec+92w
; cpm_writerec+A0r ...
dirloc db 0 ; DATA XREF: bdos:3431r searchi+7w
; ...
linfo db 0 ; DATA XREF: funcs_F_main+77w
; DRV_SET+3r ...
dminx db 0 ; DATA XREF: index+3w get$dir$ext+14w
; ...
single db 0 ; DATA XREF: get$dm+5r get$dir$ext+18r
; ...
; Nonzero if using 8-bit blocks
rcount db 0 ; DATA XREF: getfcb+1Ew setfcb+19r
; ...
extval db 0 ; DATA XREF: dm$position+Fr
; getfcb+28w
vrecord db 0 ; DATA XREF: atran+16r dm$position+4r
; ...
bcb_drive db 0 ; DATA XREF: rdbuff+17r rdbuff+3Br
; ...
bcb_record dw 0 ; DATA XREF: xios_rdwrr seekr ...
bcb_record_h db 0 ; DATA XREF: xios_rdwr+4r seek+5r
; ...
bcb_dirty dw 0 ; DATA XREF: atran+12w cpm_login+38w
; ...
drec dw 0 ; DATA XREF: rd$dir+7w r$dir+39r
; ...
fs_buffer dw 0,0 ; DATA XREF: xios_rdwr+1Br
; deblockw ...
dptr db 0 ; DATA XREF: getdptrar drv$relog+8w
; ...
user0$pass db 0 ; DATA XREF: searchnw bdos:3708r
; ...
call_flags dw 0 ; DATA XREF: F_repeat_callw
; F_repeat_call+Fr
fcb_randrec_num rb 3
error_drive db 0 ; DATA XREF: funcs_F_main+11Fr
; error+7w
strColonSpace db ' : $' ; DATA XREF: funcs_F_main+14Bw
; funcs_F_main+14Fo
error_strings dw 0 ; DATA XREF: funcs_F_main+15Do
dw offset addr_writeerr
dw offset addr_rodisk
dw offset addr_rofile
dw offset addr_invaliddrv
dw 0
dw 0
dw offset addr_pwderr
dw offset addr_filexists
dw offset addr_ambiguous
rw 3
errFilename rb 0Ch
db '$'
rb 8Ah
F_entry_sp dw 0 ; DATA XREF: funcs_F_main+27o
; F_do_callw ...
F_old_ss dw 0 ; DATA XREF: funcs_F_main+1Bw
; funcs_F_main+FAr
F_old_sp dw 0 ; DATA XREF: funcs_F_main+1Fw
; funcs_F_main+FEr
user_fcb rb 24h
rb 4
passwd_fcb rb 10h
; restore$pw$fcbo
fat_rdwr_op db 0 ; DATA XREF: fat_rdwr+Aw fat_rdwr+2Dr
; ...
newdir_cluster dw 0 ; DATA XREF: fat_make+39w fat_make+48r
; ...
scan_dirent dw 0 ; DATA XREF: is_dir_emptyw
; is_dir_empty+2Ar ...
dir_record dw 0 ; DATA XREF: is_dir_empty+Cw
; is_dir_empty+57r ...
dir_entries dw 0 ; DATA XREF: is_dir_empty+13w
; is_dir_empty+2Er ...
fs_days dw 0 ; DATA XREF: fat_to_sfcb+21o
; dos_date_to_cpm+39w
; ...
fs_hours db 0 ; DATA XREF: dos_date_to_cpm+42w
; timestamp_2_fat+5Ar
fs_minutes db 0 ; DATA XREF: dos_date_to_cpm+4Bw
; timestamp_2_fat+63r
fs_seconds db 0 ; DATA XREF: timestamp_2_fat+6Cr
p_dirent dw 0 ; DATA XREF: srch_fat+7Er srch_fat+92r
; ...
word_A15_7B1 dw 0 ; DATA XREF: fat_rdwr+122w
; fat_rdwr+159w ...
monthDays dw 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334; DATA XREF: dos_date_to_cpm+9o
; timestamp_2_fat+32o
; ...
fat_file_ptr dw 0,0 ; DATA XREF: fat_rdwr+B8w fat_rdwr+22Dr
; ...
fat_day db 0 ; DATA XREF: fat_get_date+21w
; fat_set_date+4r ...
fat_month db 0 ; DATA XREF: fat_get_date+19w
; fat_set_date+Br ...
fat_year db 0 ; DATA XREF: fat_get_date+Cw
; fat_set_date+13r ...
fat_hour db 0 ; DATA XREF: fat_get_date+41w
; fat_set_date+1Ar ...
fat_minute db 0 ; DATA XREF: fat_get_date+39w
; fat_set_date+21r ...
fat_second db 0 ; DATA XREF: fat_get_date+2Cw
; fat_set_date+29r ...
fat_deblock? db 0 ; DATA XREF: fat_rdwr+28Fw
; fat_rdwr+296w ...
nearby_cluster dw 0 ; DATA XREF: fat_make+30w fat_make+42r
; ...
fat_rdwr_flg1 db 0 ; DATA XREF: fat_rdwr+5w fat_rdwr+55w
; ...
c2f_S2 db 0 ; DATA XREF: c2f_to_extent+2r
; fat_rdwr+92w ...
c2f_EX db 0 ; DATA XREF: c2f_to_extent+9r
; fat_rdwr+96w ...
c2f_RC db 0 ; DATA XREF: fat_rdwr+9Aw fat_rdwr+356r
int13_func db 0 ; DATA XREF: F_BDOS_75+2o F_BDOS_75+2Cr
; ...
int13_drive db 0 ; DATA XREF: F_BDOS_75+10r
int13_sectors db 0 ; DATA XREF: F_BDOS_75+26r
int13_head db 0 ; DATA XREF: F_BDOS_75+3Br
int13_sector db 0 ; DATA XREF: F_BDOS_75+35r
; F_BDOS_75+99r
int13_cylinder db 0 ; DATA XREF: F_BDOS_75+3Fr
int13_buffer dw 0,0 ; DATA XREF: F_BDOS_75+20r
; F_BDOS_75+1Ar
cur_drvdir dw 0 ; DATA XREF: read$subdirr rd$parentdir+6r
; ...
dname_cluster dw 0 ; DATA XREF: set$end$dir+6w
; rd$subdir1+9r ...
names_per_block dw 0 ; DATA XREF: rd$subdir1+20r
; rd$subdir1+61r ...
chdir_drive db 0 ; DATA XREF: curselect_dir+Cw
; cpm_opendir+51r
max_cluster dw 0 ; DATA XREF: drive_login+30w
; drive_login+38w ...
dirname_0 rw 10h ; DATA XREF: proc1:0011o
dw 1
dw 0
dirname_1 dw offset dirname_2 ; DATA XREF: dseg:0192o
rw 11h
dirname_2 dw offset dirname_3 ; DATA XREF: dseg:0813o
rw 11h
dirname_3 dw 0 ; DATA XREF: dseg:0837o
rw 11h
dirdata_0 dw offset dirdata_1 ; DATA XREF: dseg:0194o
rw 4
dirdata_1 dw offset dirdata_2 ; DATA XREF: dseg:087Fo
rw 4
dirdata_2 dw offset dirdata_3 ; DATA XREF: dseg:0889o
rw 4
dirdata_3 dw offset dirdata_4 ; DATA XREF: dseg:0893o
rw 4
dirdata_4 dw offset dirdata_5 ; DATA XREF: dseg:089Do
rw 4
dirdata_5 dw offset dirdata_6 ; DATA XREF: dseg:08A7o
rw 4
dirdata_6 dw offset dirdata_7 ; DATA XREF: dseg:08B1o
rw 4
dirdata_7 dw 0 ; DATA XREF: dseg:08BBo
rw 4
;
; PADDING: The next module must be on a paragraph boundary
;
rs 16