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