antoine-source/applesqueezer/fst/msdos.s

4690 lines
130 KiB
ArmAsm

*
* MS-DOS FST
*
* (c) 1992, Apple Computer, Inc.
* (s) 2023, Brutal Deluxe Software
*
mx %00
rel
lst off
use msdos.e
*-------------------------------------------
use 4/Int.Macs
use 4/Util.Macs
*-------------------------------------------
ASC 'FST ' ; FST signature
ADRL appl_call ; call handler entry point
ADRL system_call ; GS/OS internal entry point?
DW $000A ; file system ID
fst_attr DW $8802 ; attributes
DW $0100 ; version
DW $0200 ; block size
ADRL $00010000 ; max volume size (blocks)
ADRL $00000004
ADRL $FFFFFFFF ; max file size (bytes)
ADRL $00000000
STR 'MS-DOS' ; FST name
STR 'MS-DOS FST v01.00'
DW $0000
STR 'MS-DOS FST written by Greg Branche V1.00'
appl_call PHK
PLB
REP #$30
CPX #$0067
BCS cmd_error
JMP (cmd_tbl-2,X)
cmd_error LDA #$0001
error_exit SEC
main_exit PHA
PHP
BCC L00A9
LDA cp_device_flag
BPL L00A9
LDX #fake_name_str
LDY #^fake_name_str
LDA #$0000
JSL FIND_VCR
BCS L00A9
JSL DEREF
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
JSL RELEASE_VCR
L00A9 JSL UNLOCK_MEM
PLP
PHP
BCC no_damage
LDA $02,S
AND #$00FF
CMP #$002D
BEQ mark_damaged
CMP #$005A
BEQ mark_damaged
CMP #$0051
BNE no_damage
mark_damaged LDA msdos_vcr_ptr
ORA msdos_vcr_ptr+2
BEQ no_damage
LDY #$001F
LDA [msdos_vcr_ptr],Y
INC
BEQ no_damage
LDA #$FFFF
STA [msdos_vcr_ptr],Y
LDA $01,S
JSR show_damage
no_damage LDA msdos_fcr_ptr
ORA msdos_fcr_ptr+2
BEQ no_fcr
LDA flags
AND #$0400
BEQ no_fcr
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$8000
EOR #$8000
STA math_temp
LDY #$0014
LDA [my_fcr_ptr],Y
AND #$7FFF
ORA math_temp
STA [my_fcr_ptr],Y
LDA chk_dirty_flag
BEQ no_fcr
LDA dirty_flags
BNE no_fcr
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$8007
BEQ no_fcr
LDY #$0017
LDA [msdos_vcr_ptr],Y
INC
STA [msdos_vcr_ptr],Y
no_fcr LDA write_occurred
BEQ no_write
LDA $30
PHA
LDX write_dev_num
PHX
PHY
LDA #$0040
LDX #$0000
JSL POST_OS_EVENT
no_write PLP
PLA
ORA error_priority
JMPL SYS_EXIT
write_protect JSR process_path
BCS exit
wp_error LDA #$002B
exit2 SEC
exit JMP main_exit
invalid_op LDA #$0065
BRA exit2
system_call PHK
PLB
CPX #$0009
BCS sys_err
JMP (sys_tbl-2,X)
sys_err LDA #$0001
RTL
cmd_tbl DA create
DA write_protect
DA cmd_error
DA write_protect
DA write_protect
DA get_file_info
DA invalid_op
DA volume
DA cmd_error
DA cmd_error
DA write_protect
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA open
DA cmd_error
DA read
DA wp_error
DA close
DA flush
DA set_mark
DA get_mark
DA wp_error
DA get_eof
DA cmd_error
DA cmd_error
DA get_dir_entry
DA cmd_error
DA cmd_error
DA cmd_error
DA get_dev_num
DA cmd_error
DA cmd_error
DA cmd_error
DA wp_error
DA wp_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA cmd_error
DA fst_specific
sys_tbl DA startup
DA shutdown
DA sys_remove_vol
DA deferred_flush
startup JSL GET_SYS_GBUF
STX gbuf_addr
STY gbuf_addr+2
LDA default_map
JSL ALLOC_SEG
LDA #$0054
BCS L0202
STX map_buffer_vp
STY map_buffer_vp+2
JSL DEREF
STX temp_ptr
STY temp_ptr+2
SEP #$20
LDY default_map
L01F6 DEY
BMI L0200
LDA default_map,Y
STA [temp_ptr],Y
BRA L01F6
L0200 REP #$21
L0202 RTL
chk_dirty_flag DW $0000
volume JSR setup_params
LDA $36
JSR id_disk
BCC its_my_puppy
vol_exit BRL main_exit
its_my_puppy LDY #$0004
LDA [my_pblk_ptr],Y
STA temp_ptr
INY
INY
LDA [my_pblk_ptr],Y
STA temp_ptr+2
STZ case_bits
BIT fst_attr
BPL L022D
LDA #$FFDF
STA case_bits
L022D LDA pcount
BNE L025E
LDA gstring
INC
STA [temp_ptr]
INC temp_ptr
BNE L023E
INC temp_ptr+2
L023E LDY #$0001
SEP #$20
LDA #$2F
STA [temp_ptr]
L0247 LDA gstring+1,Y
STA [temp_ptr],Y
CPY gstring
BEQ L0254
INY
BRA L0247
L0254 REP #$20
LDA #$0003
STA pcount
BRA do_bitmap
L025E LDA gstring
TAX
INC
STA math_temp
SEC
LDA [temp_ptr]
SBC #$0004
BMI too_small
CMP math_temp
BEQ size_ok
BCS size_ok
LDY #$0002
LDA math_temp
STA [temp_ptr],Y
too_small SEC
LDA #$004F
BRL vol_exit
size_ok LDY #$0002
LDA math_temp
STA [temp_ptr],Y
INY
INY
LDA #$3A3A
STA [temp_ptr],Y
PHX
TYA
CLC
ADC temp_ptr
STA temp_ptr
LDA #$0000
ADC temp_ptr+2
STA temp_ptr+2
PLY
STY math_temp
LDY #$0001
SEP #$20
L02A5 LDA gstring+1,Y
STA [temp_ptr],Y
CPY math_temp
BEQ L02B1
INY
BRA L02A5
L02B1 REP #$20
DEC pcount
DEC pcount
do_bitmap DEC pcount
BPL send_tot_blks
end_volume CLC
backup2 BRL vol_exit
send_tot_blks LDY #$0008
LDA [msdos_vcr_ptr],Y
LDY #$0008
STA [my_pblk_ptr],Y
INY
INY
LDA #$0000
STA [my_pblk_ptr],Y
DEC pcount
BMI end_volume
JSR calc_free_blks
BCS backup2
LDY #$000C
STA [my_pblk_ptr],Y
INY
INY
LDA #$0000
STA [my_pblk_ptr],Y
DEC pcount
BMI end_volume
LDA #$000A
LDY #$0010
STA [my_pblk_ptr],Y
DEC pcount
BMI end_volume
LDA #$0200
LDY #$0012
STA [my_pblk_ptr],Y
BRA end_volume
error_priority DW $0000
deferred_flush JSR save_def
JSR standard_req
LDA #$0200
STA $14
LDX $3E
LDY $40
STX my_vcr_ptr
STY my_vcr_ptr+2
JSR setup_my_vcr
LDA #$8001
STA $16
JSR mount_volume
BCS L0331
LDA [my_vcr_ptr]
STA $18
JSL CACHE_LOCK
BCC L0331
L0331 JSR restore_def
CLC
RTL
save_def PHP
PHY
PHX
PHA
LDX #$004A
L033D LDA $00,X
STA def_dir_page,X
DEX
BPL L033D
LDX #$0052
L0348 LDA fst_start,X
STA def_my_direct,X
DEX
BPL L0348
LDX #$0013
L0353 LDA volume_name,X
STA def_vol_name,X
DEX
BPL L0353
BRA L0384
restore_def PHP
PHY
PHX
PHA
LDX #$004A
L0365 LDA def_dir_page,X
STA $00,X
DEX
BPL L0365
LDX #$0052
L0370 LDA def_my_direct,X
STA fst_start,X
DEX
BPL L0370
LDX #$0013
L037B LDA def_vol_name,X
STA volume_name,X
DEX
BPL L037B
L0384 PLA
PLX
PLY
PLP
RTS
read LDA #$0002
STA $02
JSR setup_params
JSR read_write_setup
STZ newline_len
LDY #$0012
LDA [my_fcr_ptr],Y
STA newline_mask
BEQ L03BE
LDY #$0010
LDA [my_fcr_ptr],Y
STA newline_len
BEQ L03BE
LDY #$000C
LDA [my_fcr_ptr],Y
TAX
INY
INY
LDA [my_fcr_ptr],Y
TAY
JSL DEREF
STX newline_ptr
STY newline_ptr+2
L03BE LDY #$000C
LDA [my_vcr_ptr],Y
STA $00
LDY #$0014
LDA [my_fcr_ptr],Y
AND #$3FFF
CMP #$0002
BNE i_can_read
LDA #$004E
L03D5 SEC
BRL main_exit
i_can_read JSR setup_curr_mark
JSR setup_curr_eof
LDA curr_mark+2
CMP curr_eof+2
BCC L03F4
LDA curr_mark
CMP curr_eof
BNE L03F4
LDA #$004C
BRA L03D5
L03F4 LDY #$001C
LDA [msdos_fcr_ptr],Y
CMP #$00D0
BCC allow_read
LDA #$004B
BRA L03D5
allow_read JSR chk_swapped
BCC disk_online
BRL main_exit
disk_online LDA $00
LDY #$000C
STA [my_vcr_ptr],Y
LDY #$0006
LDA [my_vcr_ptr],Y
AND #$BFFF
STA [my_vcr_ptr],Y
LDA curr_mark
ADC user_req_cnt
STA math_temp
LDA curr_mark+2
ADC user_req_cnt+2
CMP curr_eof+2
BCC not_greater
BNE too_large
LDA math_temp
CMP curr_eof
BCC not_greater
BEQ not_greater
too_large SEC
LDA curr_eof
SBC curr_mark
STA user_req_cnt
LDA curr_eof+2
SBC curr_mark+2
STA user_req_cnt+2
not_greater LDA newline_len
BEQ single_block
DEC
BNE single_block
LDA [newline_ptr]
AND #$00FF
STA newline_char
single_block JSR send_partial
BCC fast_loop
CLC
BRL end_read_write
fast_loop LDA user_req_cnt+2
BNE do_seq_blks
LDA user_req_cnt
CMP #$0201
BCS do_seq_blks
BRL send_last
do_seq_blks LDA newline_len
BNE single_block
JSR num_seq_blks
BEQ single_block
PHY
TXA
JSR Cluster2Block
CLC
ADC $01,S
STA $10
STZ $12
STZ $08
STZ $0A
PLA
LDA user_req_cnt+1
LSR
CMP math_temp
BCC use_users_size
LDA math_temp
use_users_size ASL
STA $09
LDA users_buf_ptr
STA $04
LDA users_buf_ptr+2
STA $06
JSR read_with_mount
BCC cont001
BRL end_read_write
cont001 JSR rw_adjust
BRL fast_loop
send_last JSR send_partial
CLC
end_read_write PHP
PHA
LDY #$000A
LDA tran_cnt
STA [my_pblk_ptr],Y
INY
INY
LDA tran_cnt+2
STA [my_pblk_ptr],Y
JSR save_curr_mark
PLA
PLP
BRL main_exit
bump_mark STA math_temp
CLC
LDA users_buf_ptr
ADC math_temp
STA users_buf_ptr
BCC do_mark
INC users_buf_ptr+2
CLC
do_mark LDA curr_mark
ADC math_temp
STA curr_mark
BCC do_tran
INC curr_mark+2
CLC
do_tran LDA tran_cnt
ADC math_temp
STA tran_cnt
BCC do_req_cnt
INC tran_cnt+2
do_req_cnt SEC
LDA user_req_cnt
SBC math_temp
STA user_req_cnt
BCS end_bump
DEC user_req_cnt+2
end_bump RTS
set_users_buf LDA users_buf_ptr
STA $04
LDA users_buf_ptr+2
STA $06
RTS
get_file_info JSR setup_params
JSR process_path
JSR move_dir_entry
STZ fcr_wanted
L051E JSR get_next_fcr
BCS loop_done
LDY #$0008
LDA [my_fcr_ptr],Y
CMP [my_vcr_ptr]
BNE L051E
LDY #$0006
LDA [msdos_fcr_ptr],Y
CMP one_entry_start_cluster
BNE L051E
LDY #$0012
LDA [msdos_fcr_ptr],Y
BPL L051E
LDY #$0008
LDA [msdos_fcr_ptr],Y
STA one_entry_file_size
INY
INY
LDA [msdos_fcr_ptr],Y
STA one_entry_file_size+2
loop_done LDA storage_type
CMP #$00F0 ; volume_header
BNE go_send_info
JSR calc_free_blks
BCC L055C
BRL main_exit
L055C STA one_entry_reserved
LDY #$0008
LDA [msdos_vcr_ptr],Y
STA one_entry_file_size
SEC
SBC one_entry_reserved
STA one_entry_reserved+4
go_send_info LDA pcount
BEQ old_style_info
CLC
LDA my_pblk_ptr
ADC #$0004
TAX
LDA my_pblk_ptr+2
ADC #$0000
TAY
LDA pcount
DEC
JSR send_info
BRL main_exit
old_style_info LDX #$00C3
LDA one_entry_attributes
BIT #$0001
BEQ L0598
LDX #$0001
L0598 BIT #$0020
BEQ L05A4
PHA
TXA
ORA #$0020
TAX
PLA
L05A4 BIT #$0006
BEQ L05AE
TXA
ORA #$0004
TAX
L05AE TXA
LDY #$0004
STA [my_pblk_ptr],Y
INY
INY
LDX #$000F
LDA one_entry_attributes
BIT #$0010
BNE L05C4
JSR get_file_type
L05C4 TXA
STA [my_pblk_ptr],Y
INY
INY
LDA #$0000
STA [my_pblk_ptr],Y
INY
INY
STA [my_pblk_ptr],Y
LDA one_entry_attributes
BIT #$0010
BNE L05E3
JSR get_file_type
DEY
DEY
STA [my_pblk_ptr],Y
INY
INY
L05E3 INY
INY
LDA storage_type
STA [my_pblk_ptr],Y
INY
INY
LDA one_entry_date
AND #$01FF
PHA
LDA one_entry_date
XBA
LSR
AND #$007F
CLC
ADC #$0050
XBA
ASL
ORA $01,S
STA [my_pblk_ptr],Y
STA $01,S
INY
INY
LDA one_entry_time
TAX
AND #$F800
LSR
LSR
LSR
PHA
TXA
LSR
LSR
LSR
LSR
AND #$003F
ORA $01,S
STA [my_pblk_ptr],Y
TAX
INY
INY
PLA
STA [my_pblk_ptr],Y
INY
INY
TXA
STA [my_pblk_ptr],Y
INY
INY
LDA one_entry_reserved+4
STA [my_pblk_ptr],Y
INY
INY
LDA #$0000
STA [my_pblk_ptr],Y
CLC
BRL main_exit
calc_last_mod LDA $00
LDX #dummy_name
LDY #^dummy_name
JSR find_file
LDA curr_mod_date
TAX
ORA curr_mod_date+2
BEQ same_time
STX one_entry+last_mod_index
LDA curr_mod_date+2
STA one_entry+last_mod_index+2
RTS
same_time LDA one_entry_date
STA one_entry+last_mod_index
LDA one_entry_start_cluster
STA one_entry+last_mod_index+2
RTS
read_with_mount LDA #$0002
BRA L0670
write_with_mount LDA #$0003
L0670 STA $02
JSR dev_with_mount
RTS
tran_cnt ADRL $00000000
save_curr_mark LDY #$0018
LDA curr_mark
STA [msdos_fcr_ptr],Y
INY
INY
LDA curr_mark+2
STA [msdos_fcr_ptr],Y
RTS
curr_mark ADRL $00000000
setup_curr_mark LDY #$0018
LDA [msdos_fcr_ptr],Y
STA curr_mark
INY
INY
LDA [msdos_fcr_ptr],Y
STA curr_mark+2
RTS
get_eof JSR setup_params
LDY #$0008
LDA [msdos_fcr_ptr],Y
TAX
INY
INY
LDA [msdos_fcr_ptr],Y
LDY #$0004
STA [my_pblk_ptr],Y
DEY
DEY
TXA
STA [my_pblk_ptr],Y
CLC
BRL main_exit
open STZ resource_num
STZ access
STZ users_access
JSR setup_params
BEQ open_class0
JSR get_access
BCS open_class0
JSR get_res_num
open_class0 JSR process_path
JSR move_dir_entry
JSR verify_storage
BCS open_exit
JSR check_dup
BCS open_exit
JSR build_the_fcr
BCS open_exit
LDY #$0000
LDA $30
AND #$E000
BEQ L06F1
LDY #$0002
L06F1 LDA [my_fcr_ptr]
STA [$32],Y
JSR send_open_parms
BCC open_exit
PHA
JSR remove_fcr
PLA
SEC
open_exit BRL main_exit
send_open_parms LDA pcount
CMP #$0005
BCC L0720
SBC #$0004
PHA
CLC
LDA my_pblk_ptr
ADC #$000A
TAX
LDA my_pblk_ptr+2
ADC #$0000
TAY
PLA
JSR send_info
L0720 RTS
verify_storage LDA storage_type
STA entry_sto_type
CMP #$0050
BEQ setup_access
LDX resource_num
BNE bad_resource
CMP #$0010
BEQ setup_access
CMP #$00D0
BEQ L0740
CMP #$00F0
BNE bad_storage
L0740 LDA access
BEQ L074A
CMP #$0002
BCS bad_access
L074A LDA #$0001
STA access
CLC
RTS
setup_access LDA access
BNE verify_access
LDX #$0001
LDA one_entry_attributes
AND #$0001
BNE L0765
LDX #$0003
L0765 STX access
CLC
RTS
verify_access LSR
LSR
BCC exit_access
LDA one_entry_attributes
AND #$0001
BEQ bad_access
CLC
exit_access RTS
bad_resource LDA #$0063
SEC
RTS
bad_access LDA #$004E
SEC
RTS
bad_storage LDA #$004B
SEC
RTS
get_res_num LDA pcount
CMP #$0004
BCC end_res
LDY #$0008
LDA [my_pblk_ptr],Y
STA resource_num
BEQ end_res
DEC
BNE not_in_range
end_res RTS
get_access LDA pcount
CMP #$0003
BCC no_params
LDY #$0006
LDA [my_pblk_ptr],Y
STA users_access
BEQ end_access
STA access
CMP #$0004
BCC end_access
not_in_range LDA #$0053
BRL error_exit
no_params SEC
RTS
end_access CLC
RTS
newline_char DW $0000
find_file STA $00
STX temp_ptr
STY temp_ptr+2
LDA gbuf_addr
STA gbuf_ptr
STA $04
LDA gbuf_addr+2
STA gbuf_ptr+2
STA $06
STZ curr_mod_date
STZ curr_mod_date+2
LDY #$0006
LDA [msdos_vcr_ptr],Y
LSR
LSR
LSR
LSR
STA sector_count
STZ cluster_num
LDY #$0015
LDA [msdos_vcr_ptr],Y
STA dir_start_blk
STA dir_last_blk
STA $10
STZ $12
JSR standard_req
LDA #$0002
STA $02
STZ chars_checked
STZ path_searched
JSR setup_name
STZ entries_blk_num
outter_loop STZ last_blk
STZ free_dir_blk
STZ free_dir_offset
STZ searching_free
search_loop JSR read_with_cache
BCS error_leave
LDY #$0000
STZ entries_checked
JSR check_block
BCC found
BIT searching_free
BPL @check_active
LDA free_dir_blk
BEQ load_next
BIT path_searched
BPL load_next
BRA no_more_blks
@check_active LDA entries_checked
CMP #$0010
BNE not_found
load_next DEC sector_count
BEQ next_cluster
INC $10
INC dir_last_blk
BRA search_loop
next_cluster LDA cluster_num
BEQ no_more_blks
JSR get_FAT_entry
BCS no_more_blks
STA cluster_num
JSR Cluster2Block
STA $10
STA dir_last_blk
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
STA sector_count
BRA search_loop
not_found BIT search_flag
BVC no_more_blks
LDA free_dir_blk
BNE no_more_blks
DEC searching_free
BRA load_next
no_more_blks LDA path_searched
BNE file_err
LDA #$0044
SEC
RTS
file_err LDA #$0046
SEC
error_leave RTS
found LDA $10
STA entries_blk_num
STA dir_last_blk
STY entries_offset
TYX
LDY chars_checked
DEY
LDA [temp_ptr],Y
AND #$00FF
BEQ find_success
TXA
CLC
ADC #$000B
TAY
LDA [gbuf_ptr],Y
AND #$0010
BEQ not_found
LDA $10
STA slug_block
STX slug_offset
TXA
CLC
ADC #$001A
TAY
LDA [gbuf_ptr],Y
STA cluster_num
JSR Cluster2Block
STA $10
STA dir_start_blk
STA dir_last_blk
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
STA sector_count
JSR setup_name
BRL outter_loop
find_success TXA
PHA
CLC
ADC gbuf_ptr
TAX
LDA #$0000
ADC gbuf_ptr+2
TAY
PLA
CLC
RTS
sector_count DW $0000
cluster_num DW $0000
check_block LDA entries_checked
CMP #$0010
BEQ check_done
INC entries_checked
LDA [gbuf_ptr],Y
CMP #$2E2E ; '..'
BEQ next_entry
AND #$00FF
BEQ check_done
CMP #$002E ; '.'
BEQ next_entry
CMP #$00E5
BEQ chk_need_free
JSR save_latest_mod
JSR check_name
BCS next_entry
PHY
TYA
CLC
ADC #$000B
TAY
LDA [gbuf_ptr],Y
PLY
AND #$0008
BNE next_entry
CLC
RTS
chk_need_free LDA free_dir_blk
BNE next_entry
LDA $10
STA free_dir_blk
STY free_dir_offset
next_entry TYA
CLC
ADC #$0020
TAY
BRA check_block
check_done SEC
RTS
save_latest_mod PHY
PHX
PHA
TYA
CLC
ADC #$0018
TAY
LDA [gbuf_ptr],Y
TAX
CMP curr_mod_date
BCC L0975
BEQ check_time
DEY
DEY
LDA [gbuf_ptr],Y
STA curr_mod_date+2
STX curr_mod_date
BRA L0975
check_time DEY
DEY
LDA [gbuf_ptr],Y
CMP curr_mod_date+2
BCC L0975
STA curr_mod_date+2
STX curr_mod_date
L0975 PLA
PLX
PLY
RTS
check_name PHY
LDX #$0000
SEP #$20
L097F LDA [gbuf_ptr],Y
CMP #$05
BNE L098C
CPX #$0000
BNE L098C
LDA #$E5
L098C EOR search_name,X
AND #$DF
BNE L099B+1
INX
INY
CPX #$000B
BNE L097F
CLC
L099B BCS L09D5
REP #$20
PLY
RTS
setup_name PHY
LDY chars_checked
LDA [temp_ptr],Y
AND #$00FF
BNE more_names
DEC path_searched
PLY
SEC
RTS
more_names SEP #$20
LDX #$0000
looper LDA [temp_ptr],Y
BEQ end_path
CMP #$3A ; delimiter
BEQ end_name
CMP #$41 ; A
BCC not_alpha
CMP #$5B ; Z+1
BCC is_legal
not_alpha CMP #$2E ; .
BNE not_extension
LDA #$20
space_fill CPX #$0008
BCS do_extension
STA search_name,X
L09D5 INX
BRA space_fill
not_extension PHX
LDX #$000D
char_check CMP illegal_chars,X
BEQ bad_filename
DEX
BPL char_check
PLX
is_legal CPX #$0008
BCS truncate
STA search_name,X
INX
truncate INY
BRA looper
bad_filename PLX
REP #$20
LDA #$0040
SEC
BRL main_exit
MX %10
do_extension INY
LDA [temp_ptr],Y
BEQ end_path
CMP #$3A
BEQ end_name
CMP #$41
BCC L0A0C
CMP #$5B
BCC L0A19
L0A0C PHX
LDX #$000D
L0A10 CMP illegal_chars,X
BEQ bad_filename
DEX
BPL L0A10
PLX
L0A19 CPX #$000B
BCS L0A22
STA search_name,X
INX
L0A22 BRA do_extension
end_path DEC path_searched+1
end_name INY
STY chars_checked
LDA #$20
L0A2D CPX #$000B
BCS L0A38
STA search_name,X
INX
BRA L0A2D
L0A38 STX search_length
REP #$30
PLY
CLC
RTS
illegal_chars ASC '.;,=+/"[]|<> '09
entries_checked DW $0000
chars_checked DW $0000
free_dir_blk DW $0000
volume_name DS $14
user_req_cnt ADRL $00000000
flags DW $0000
write_dev_num DW $0000
slug_block DW $0000
close JSR setup_params
DEC close_flag
JSR remove_fcr
BRL main_exit
build_the_fcr LDY #$0002
LDA [my_vcr_ptr],Y
TAX
INY
INY
LDA [my_vcr_ptr],Y
TAY
JSL DEREF
PEI temp_ptr
PEI temp_ptr+2
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
TAY
INC
STA gstring
LDA #$3A3A
STA gstring+2
INC temp_ptr
BNE L0AA8
INC temp_ptr+2
L0AA8 SEP #$20
L0AAA LDA [temp_ptr],Y
STA gstring+2,Y
DEY
BNE L0AAA
REP #$20
PLA
STA temp_ptr+2
PLA
STA temp_ptr
LDX #gstring
LDY #^gstring
LDA #$0238
SEC
JSL ALLOC_FCR
BCC success
RTS
success JSL DEREF
STX my_fcr_ptr
STY my_fcr_ptr+2
JSR setup_my_fcr
LDY #$0008
LDA [my_vcr_ptr],Y
INC
STA [my_vcr_ptr],Y
LDY #$0012
LDA #$0000
STA [msdos_fcr_ptr],Y
LDA #$4000
JSR set_fcr_status
LDA access
LDY #$0014
ORA #$8000
STA [my_fcr_ptr],Y
LDY #$0008
LDA [my_vcr_ptr]
STA [my_fcr_ptr],Y
LDY #$0006
LDA #$000A
STA [my_fcr_ptr],Y
LDY #$001C
LDA storage_type
STA [msdos_fcr_ptr],Y
CMP #$00F0
BNE no_adjust2
JSR vol_file_size
no_adjust2 LDY #$0014
LDA parent_blk
STA [msdos_fcr_ptr],Y
LDY #$0016
LDA entry_offset
STA [msdos_fcr_ptr],Y
LDA resource_num
BNE L0B3F
LDY #$0008
LDA one_entry_file_size
STA [msdos_fcr_ptr],Y
INY
INY
LDA one_entry_file_size+2
STA [msdos_fcr_ptr],Y
LDA one_entry_start_cluster
BRA L0B51
L0B3F LDY #$0008
LDA rfork_entry_file_size
STA [msdos_fcr_ptr],Y
INY
INY
LDA rfork_entry_file_size+2
STA [msdos_fcr_ptr],Y
LDA rfork_entry_start_cluster
L0B51 LDY #$0006
STA [msdos_fcr_ptr],Y
TAY
BNE L0B66
LDY #$001D
LDA [msdos_vcr_ptr],Y
SEC
LDY #$0015
SBC [msdos_vcr_ptr],Y
BRA L0B6E
L0B66 LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
L0B6E LDY #$0010
STA [msdos_fcr_ptr],Y
LDY #$0004
LDA one_entry_date
STA [msdos_fcr_ptr],Y
LDY #$0002
LDA one_entry_time
STA [msdos_fcr_ptr],Y
LDY #$0000
LDA one_entry_attributes
AND #$00FF
STA [msdos_fcr_ptr],Y
JSR setup_io_ptrs
JSR setup_io_buf
BCC L0B9C
PHA
JSR remove_fcr
PLA
SEC
L0B9C RTS
chk_swapped LDY #$0006
LDA [my_vcr_ptr],Y
AND #$4000
BEQ L0BCD
LDY #$0002
LDA [my_vcr_ptr],Y
TAX
INY
INY
LDA [my_vcr_ptr],Y
TAY
JSL DEREF
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
AND #$000F
TAY
DEY
L0BC1 LDA [temp_ptr],Y
STA volume_name,Y
DEY
BPL L0BC1
JSR mount_volume
RTS
L0BCD CLC
RTS
last_blk DW $0000
vol_file_size LDY #$0006
LDA [msdos_vcr_ptr],Y
ASL
ASL
ASL
ASL
ASL
STA one_entry_file_size
RTS
dirty_flags DW $0000
def_my_direct DS $78
setup_my_fcr CLC
LDA my_fcr_ptr
ADC #$0016
STA msdos_fcr_ptr
TAX
LDA my_fcr_ptr+2
ADC #$0000
STA msdos_fcr_ptr+2
TAY
RTS
entry_offset DW $0000
slug_offset DW $0000
entries_offset DW $0000
id_disk STA $00
LDA #$0002
STA $02
STZ $10
STZ $12
JSR standard_req
JSR set_default_buf
try_again JSR device_call
BCC id_no_error
AND #$00FF
BEQ id_no_error
CMP #$002E
BEQ try_again
SEC
L0C92 RTS
* Boot sector
* +$0000 - BS_jmpBoot - EB or E9
* +$000B - BPB_BytsPerSec - $0200
* +$01FE - BP_Signature - $AA55
id_no_error LDA [$04]
AND #$00FF
CMP #$00EB
BEQ L0CA2
CMP #$00E9
BNE L0CB6
L0CA2 LDY #$01FE
LDA [$04],Y
CMP #$AA55
BNE L0CB6
LDY #$000B
LDA [$04],Y
CMP #$0200
BEQ build_vcr
L0CB6 LDA #$0052
SEC
RTS
build_vcr LDA $04
CLC
ADC #$000B
STA $04
LDY #$0012
SEP #$20
L0CC8 LDA [$04],Y
STA bios_parm_block,Y
DEY
BPL L0CC8
REP #$20
LDA FAT_count
AND #$00FF
TAX
LDA #$0000
CLC
L0CDD ADC FAT_size
DEX
BNE L0CDD
ADC reserved_sectors
STA root_dir_block
STA $10
LDA root_dir_count
LSR
LSR
LSR
LSR
STA root_dir_size
L0CF5 LDA gbuf_addr
STA $04
JSR device_call
BCS L0C92
LDX #$0010 ; blksize/32
LDY #$000B
L0D05 LDA [$04]
AND #$00FF
BEQ L0D33
CMP #$00E5
BEQ L0D1B
LDA [$04],Y
BIT #$0008
BEQ L0D1B
BRL L0DA5
L0D1B CLC
LDA $04
ADC #$0020
STA $04
DEX
BNE L0D05
INC $10
LDA $10
SEC
SBC root_dir_block
CMP root_dir_size
BCC L0CF5
L0D33 STZ parent_blk
STZ entry_offset
LDA FAT_size
AND #$00FF
XBA
ASL
STA $08
STZ $0A
JSL ALLOC_SEG
BCS L0D67
PHY
PHX
JSL DEREF
STX fat_ptr
STY fat_ptr+2
STX $04
STY $06
LDA reserved_sectors
STA $10
STZ $12
JSR device_call
BCC L0D68
PLX
PLX
L0D67 RTS
L0D68 LDA FAT_size
AND #$00FF
XBA
ASL
TAY
LDA #$0000
CLC
L0D75 DEY
DEY
BEQ L0D7D
ADC [fat_ptr],Y
BRA L0D75
L0D7D ADC [fat_ptr]
PHA
PEA ^default_name_2
PEA default_name_2
PEA $0005
PEA $0000
_Int2Dec
PLX
PLY
JSL RELEASE_SEG
LDA #default_name
STA $04
LDA #^default_name
STA $06
BRA L0DB3
L0DA5 LDA $10
STA parent_blk
LDA $04
SEC
SBC gbuf_addr
STA entry_offset
L0DB3 SEP #$20
LDY #$000A
L0DB8 LDA [$04],Y
STA gstring+2,Y
DEY
BPL L0DB8
LDY #$000B
LDA #$20
L0DC5 DEY
CMP gstring+2,Y
BEQ L0DC5
INY
STY gstring
REP #$20
BIT cp_flags
BPL L0DD9
BRL L0E2C
L0DD9 LDX #gstring
LDY #^gstring
LDA #$0000
JSL FIND_VCR
BCS L0E42
JSL DEREF
STX my_vcr_ptr
STY my_vcr_ptr+2
LDY #$000A
LDA [my_vcr_ptr],Y
CMP #$000A
BNE check_active
JSR setup_my_vcr
BIT $16
BMI L0E12
SEP #$20
LDY #$0012
L0E06 LDA bios_parm_block,Y
CMP [msdos_vcr_ptr],Y
BNE check_active2
DEY
BPL L0E06
REP #$20
L0E12 LDY #$000C
LDA $00
STA [my_vcr_ptr],Y
JSR activate_vcr
CLC
RTS
L0E1E LDA #$0057
SEC
L0E22 RTS
check_active2 REP #$20
check_active LDY #$0008
LDA [my_vcr_ptr],Y
BEQ L0E3F
L0E2C LDA cp_device_flag
BEQ L0E1E
ORA #$8000
STA cp_device_flag
LDA $00
JSL SWAP_OUT
BRA L0E42
L0E3F JSR free_vcr
L0E42 LDA FAT_size
AND #$00FF
XBA
ASL
STA FAT_byte_count
LDX #gstring
LDY #^gstring
LDA cp_device_flag
BPL L0E5E
LDX #fake_name_str
LDY #^fake_name_str
L0E5E LDA #$002F
CLC
ADC FAT_byte_count
JSL ALLOC_VCR
BCS L0E22
JSL DEREF
STX my_vcr_ptr
STY my_vcr_ptr+2
JSR setup_my_vcr
LDY #$000A
LDA #$000A
STA [my_vcr_ptr],Y
LDY #$000C
LDA $00
STA [my_vcr_ptr],Y
LDY #$0006
LDA #$0000
STA [my_vcr_ptr],Y
LDY #$0012
SEP #$20
L0E92 LDA bios_parm_block,Y
STA [msdos_vcr_ptr],Y
DEY
BPL L0E92
REP #$20
TYA
LDY #$0013
STA [msdos_vcr_ptr],Y
LDY #$0015
LDA root_dir_block
STA [msdos_vcr_ptr],Y
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
TAX
LDY #$0008
LDA [msdos_vcr_ptr],Y
L0EB8 PHA
TXA
LSR
TAX
PLA
BCS L0EC2
LSR
BRA L0EB8
L0EC2 LDX #$0000
CMP #$0FF8
BCC L0ECB
INX
L0ECB LDY #$001B
TXA
STA [msdos_vcr_ptr],Y
LDY #$0006
LDA [msdos_vcr_ptr],Y
LSR
LSR
LSR
LSR
CLC
LDY #$0015
ADC [msdos_vcr_ptr],Y
LDY #$001D
STA [msdos_vcr_ptr],Y
LDA my_vcr_ptr
CLC
ADC #$002F
STA $04
LDA my_vcr_ptr+2
ADC #$0000
STA $06
LDA FAT_byte_count
STA $08
STZ $0A
LDA reserved_sectors
STA $10
STZ $12
JSR device_call
RTS
pcount DW $0000
newline_mask DW $0000
close_flag DW $0000
read_with_cache LDA #$0002
BRA L0F14
write_with_cache LDA #$0003
L0F14 STA $02
LDA [my_vcr_ptr]
STA $18
LDA $1A
PHA
LDA #$8002
STA $1A
JSR dev_with_mount
PHP
TAX
LDA $02,S
STA $1A
TXA
PLP
PLX
RTS
get_file_type PHY
LDX #$0000
LDA map_enable_flag
BEQ L0F7D
JSR deref_map
LDA #$0000
SEP #$20
LDY #$0002
L0F43 LDX #$0000
LDA [map_ptr],Y
BEQ L0F7D
LDX #$0000
L0F4D INX
INY
LDA [map_ptr],Y
BNE L0F4D
PHY
STX length
DEY
CPX filename_length
BEQ L0F5F
BCS L0F81
L0F5F LDX filename_length
L0F62 LDA [map_ptr],Y
CMP filename_length+1,X
BNE L0F81
DEY
DEX
DEC length
BNE L0F62
PLY
INY
LDA [map_ptr],Y
REP #$20
AND #$00FF
TAX
INY
LDA [map_ptr],Y
L0F7D REP #$20
PLY
RTS
L0F81 PLY
INY
INY
INY
INY
BRA L0F43
calc_free_blks LDY #$0013
LDA [msdos_vcr_ptr],Y
INC
BEQ L0F93
DEC
CLC
RTS
L0F93 JSR setup_fat_ptr
LDY #$0008
LDA [msdos_vcr_ptr],Y
STA math_temp
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
PHA
LSR
BEQ L0FAE
L0FA9 LSR math_temp
LSR
BNE L0FA9
L0FAE LDX math_temp
STZ math_temp
L0FB2 TXA
JSR get_FAT_entry
TAY
BNE L0FC0
LDA math_temp
CLC
ADC $01,S
STA math_temp
L0FC0 DEX
BNE L0FB2
PLA
LDA math_temp
LDY #$0013
STA [msdos_vcr_ptr],Y
CLC
RTS
deref_map LDX map_buffer_vp
LDY map_buffer_vp+2
JSL DEREF
STX map_ptr
STY map_ptr+2
RTS
case_bits DW $0000
flush JSR setup_params
DEC close_flag
LDA pcount
CMP #$0002
BCC L1001
LDY #$0004
LDA [$32],Y
ASL
BEQ L0FFA
LDA #$0053
SEC
BRA L1004
L0FFA BCC L1001
JSR do_fast_flush
BRA L1004
L1001 JSR flush_file
L1004 BRL main_exit
process_path LDA #$8002
STA $1A
LDA #$4000
LDX $3A
LDY $3C
JSR build_path
BCC L101B
BRL dev_or_vol
L101B LDA search_flag
AND #$2000
BEQ L1028
LDA #$0040
SEC
RTS
L1028 STX hold_path_ptr
STY hold_path_ptr+2
LDA $36
BEQ L103E
STA $00
L1034 LDA $00
JSR id_disk
BCC L1046
L103B BRL main_exit
L103E JSR vol_to_buffer
JSR find_volume
BCS L103B
L1046 LDA #$8000
STA error_priority
LDA flags
AND #$0100
BEQ L1057
JSR check_spans
L1057 LDA flags
AND #$2000
BEQ L106F
JSR setup_my_vcr
LDY #$001F
LDA [msdos_vcr_ptr],Y
BEQ L106F
LDA #$0051
BRL damaged_message
L106F LDA $00
LDX hold_path_ptr
LDY hold_path_ptr+2
JSR find_file
BCC save_parent
CMP #$002E
BEQ L1034
BIT search_flag
BVC not_ok
CMP #$0046
BNE not_ok
SEC
RTS
not_ok SEC
BRL main_exit
save_parent STA entry_offset
LDA $10
STA parent_blk
STX $04
STY $06
L109D JSR set_user_cache
RTS
dev_or_vol LDA $36
BEQ L10DD
JSR id_disk
BCS L10DA
L10AA LDA #$8000
STA error_priority
BIT search_flag
BMI L10D6
LDA parent_blk
BEQ L10CA
LDA entry_offset
CLC
ADC gbuf_addr
STA $04
LDA gbuf_addr+2
STA $06
BRA L109D
L10CA LDA #default_name
STA $04
LDA #^default_name
STA $06
BRA L109D
L10D6 LDA #$0040
SEC
L10DA BRL main_exit
L10DD JSR find_volume
BCC L10AA
BRL main_exit
set_user_cache PHA
LDA user_cache
STA $1A
PLA
RTS
path_searched DW $0000
root_dir_block DW $0000
root_dir_size DW $0000
FAT_byte_count DW $0000
default_name ASC 'MSDOS#'
default_name_2 ASC ' '
DB $08 ; attributes
DS 10 ; reserved
DW $0000 ; time
DW $0000 ; date
DW $0000 ; starting cluster
ADRL $00000000 ; file size
search_length DW $0000
damaged_message PHA
JSR show_damage
JSL UNLOCK_MEM
SEC
PLA
JMPL SYS_EXIT
show_damage JSR setup_vol_mesg
LDA volume_name
XBA
STA volume_name
PEA $0003
PEA ^volume_name
PEA volume_name+1
PEA $0000
PEA $0000
JSL REPORT_ERROR
LDA volume_name
XBA
STA volume_name
RTS
setup_vol_mesg LDY #$0002
LDA [my_vcr_ptr],Y
TAX
INY
INY
LDA [my_vcr_ptr],Y
TAY
JSL DEREF
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
TAY
INY
L1161 LDA [temp_ptr],Y
STA volume_name,Y
DEY
BPL L1161
RTS
curr_eof ADRL $00000000
searching_free DW $0000
setup_my_vcr JSR setup_fat_ptr
CLC
LDA my_vcr_ptr
ADC #$000E
STA msdos_vcr_ptr
TAX
LDA my_vcr_ptr+2
ADC #$0000
STA msdos_vcr_ptr+2
TAY
RTS
parent_blk DW $0000
remove_fcr LDY #$0017
LDA [msdos_vcr_ptr],Y
DEC
BNE L118F
L118F LDY #$0008
LDA [my_vcr_ptr],Y
DEC
BMI L11A1
STA [my_vcr_ptr],Y
LDA [my_fcr_ptr]
JSL RELEASE_FCR
CLC
RTS
L11A1 LDA #$534B ; SK
JMPL SYS_DEATH
fcr_wanted DW $0000
setup_params LDA gbuf_addr
STA gbuf_ptr
LDA gbuf_addr+2
STA gbuf_ptr+2
STZ $18
STZ search_flag
STZ msdos_vcr_ptr
STZ msdos_vcr_ptr+2
STZ my_vcr_ptr
STZ my_vcr_ptr+2
STZ msdos_fcr_ptr
STZ msdos_fcr_ptr+2
STZ case_bits
STZ slug_block
STZ close_flag
STZ expand_record_expand_file
STZ expand_record_expand_flag
STZ chk_dirty_flag
STZ dirty_flags
STZ dirty_cnt_changed
STZ write_occurred
STZ cp_device_flag
STZ cp_flags
STZ error_priority
LDA start_tbl-2,X
STA flags
AND #$001F
STA max_pcount
STZ pcount
TYA
LSR
STA class
BEQ L1233
LDA flags
AND #$00E0
ASL
ASL
ASL
XBA
CMP class
BCS L1213
LDA #$0062
BRA L121D
L1213 LDA [$32]
CMP max_pcount
BCC L1220
LDA #$0004
L121D BRL main_exit
L1220 STA pcount
LDA $32
ADC #$0002
STA my_pblk_ptr
LDA $34
ADC #$0000
STA my_pblk_ptr+2
BRA L123B
L1233 LDA $32
STA my_pblk_ptr
LDA $34
STA my_pblk_ptr+2
L123B LDX #$000A
STX $16
JSL LOCK_MEM
LDA $36
STA $00
LDA flags
AND #$0200
BEQ L1294
LDX $3E
LDY $40
JSL DEREF
STX my_vcr_ptr
STY my_vcr_ptr+2
JSR setup_my_vcr
LDA flags
AND #$2000
BEQ L1276
LDY #$001F
LDA [msdos_vcr_ptr],Y
INC
BNE L1276
SEC
LDA #$004E
BRL main_exit
L1276 LDY #$0006
LDA [my_vcr_ptr],Y
AND #$4000
BEQ L1294
LDA $30
AND #$DFFF
CMP #$0014
BNE L1291
LDY #$0017
LDA [msdos_vcr_ptr],Y
BEQ L1294
L1291 JSR mount_volume
L1294 LDA flags
AND #$0400
BEQ L12BD
LDX $3A
LDY $3C
JSL DEREF
STX my_fcr_ptr
STY my_fcr_ptr+2
JSR setup_my_fcr
LDA flags
AND #$1000
BEQ L12BD
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$8000
BEQ L12BD
L12BD LDA flags
AND #$0800
BEQ L12C8
JSR setup_io_ptrs
L12C8 LDA flags
AND #$4000
BEQ L12DE
STA chk_dirty_flag
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$8007
STA dirty_flags
L12DE LDA class
RTS
send_partial JSR fill_io_buf
BCC filled_up
BRL end_read_write
filled_up LDA curr_mark
AND #$01FF
SEC
SBC #$0200
EOR #$FFFF
INC
LDX user_req_cnt+2
BNE send_all_bytes
CMP user_req_cnt
BEQ send_all_bytes
BCC send_all_bytes
LDA user_req_cnt
send_all_bytes STA math_temp
TAY
LDA newline_len
BNE check_newline
CLC
LDA curr_mark
AND #$01FF
ADC data_ptr
TAX
LDA #$0000
ADC data_ptr+2
CPY #$0021
BCC send_small
PHA
PHX
PEI users_buf_ptr+2
PEI users_buf_ptr
PEA $0000
PHY
PEA $0805
JSL MOVE_INFO
BRA end_partial
send_small STX temp_ptr
STA temp_ptr+2
DEY
TYA
BMI end_partial
CMP #$0002
BCC send_8_bit
DEC
ROR
BCS send_8_bit
DEY
loop_16 LDA [temp_ptr],Y
STA [users_buf_ptr],Y
DEY
DEY
BPL loop_16
BRA end_partial
send_8_bit SEP #$20
loop_8 LDA [temp_ptr],Y
STA [users_buf_ptr],Y
DEY
BPL loop_8
REP #$20
end_partial LDA math_temp
JSR bump_mark
LDA user_req_cnt
ORA user_req_cnt+2
BEQ all_done
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$8000
BEQ L1374
L1374 CLC
RTS
all_done SEC
RTS
check_newline TAX
LDA curr_mark
AND #$01FF
TAY
STA entries_checked
SEC
LDA users_buf_ptr
SBC entries_checked
STA temp_ptr
LDA users_buf_ptr+2
SBC #$0000
STA temp_ptr+2
CLC
TYA
ADC math_temp
STA entries_checked
DEX
BNE slow_read
PHP
SEP #$20
fast_newline LDA [data_ptr],Y
STA [temp_ptr],Y
AND newline_mask
CMP newline_char
BEQ found_newline
INY
CPY entries_checked
BNE fast_newline
PLP
MX %00
BRA end_partial
found_newline PLP
MX %00
LDA curr_mark
AND #$01FF
STA math_temp
SEC
TYA
SBC math_temp
INC
JSR bump_mark
STZ user_req_cnt
STZ user_req_cnt+2
SEC
RTS
slow_read PHP
SEP #$20
slow_newline LDA [data_ptr],Y
STA [temp_ptr],Y
AND newline_mask
TYX
LDY newline_len
DEY
next_newline CMP [newline_ptr],Y
BEQ found_one
DEY
BPL next_newline
TXY
INY
CPY entries_checked
BNE slow_newline
PLP
MX %00
BRL end_partial
found_one TXY
BRA found_newline
filename_length DW $0000
filename_text DS $C
build_path STA and_mask
INX
BNE L1406
INY
L1406 INX
BNE L140A
INY
L140A STX temp_ptr
STY temp_ptr+2
LDA $42
AND and_mask
BNE L1417
SEC
RTS
L1417 LDA $36
BEQ L141D
L141B CLC
RTS
L141D JSR vol_to_buffer
PHA
INY
INY
TYA
LDY temp_ptr+2
CLC
ADC temp_ptr
TAX
BCC L142D
INY
L142D PLA
BNE L141B
SEC
RTS
fake_name_str DW $0003
DB $0C
DB $0A
DB $0E
DB $00
set_default_buf LDA gbuf_addr
STA $04
LDA gbuf_addr+2
STA $06
RTS
standard_req LDA #$0200
STA $08
STZ $0A
RTS
hold_path_ptr ADRL $00000000 ; Fixed bug
default_map DW $007E
ASC '.TXT'00
DB $04
DW $0000
ASC '.BAT'00
DB $04
DW $0000
ASC '.BIN'00
DB $06
DW $0000
ASC '.ASC'00
DB $04
DW $0000
ASC '.C'00
DB $04
DW $0000
ASC '.H'00
DB $04
DW $0000
ASC '.PAS'00
DB $04
DW $0000
ASC '.ASM'00
DB $04
DW $0000
ASC '.LST'00
DB $04
DW $0000
ASC '.COB'00
DB $04
DW $0000
ASC '.FOR'00
DB $04
DW $0000
ASC '.DOC'00
DB $04
DW $0000
ASC '.SRC'00
DB $04
DW $0000
ASC '.GIF'00
DB users_buf_ptr
DW $8006
ASC '.DOX'00
DB $04
DW $0000
ASC '.ME'00
DB $04
DW $0000
DB $00
def_vol_name DS $14
fst_specific LDA [$32]
CMP #$0003
BEQ L14ED
LDA #$0004
SEC
BRL main_exit
L14ED LDY #$0004
LDA [$32],Y
CMP #$0004
BCS L14FF
ASL
TAX
JSR (specific_cmds,X)
BRL main_exit
L14FF LDA #$0065
SEC
BRL main_exit
specific_cmds DA map_enable
DA get_map_size
DA get_map_table
DA set_map_table
sys_remove_vol CLC
RTL
get_mark JSR setup_params
LDY #$0018
LDA [msdos_fcr_ptr],Y
TAX
INY
INY
LDA [msdos_fcr_ptr],Y
LDY #$0004
STA [my_pblk_ptr],Y
DEY
DEY
TXA
STA [my_pblk_ptr],Y
CLC
BRL main_exit
set_mark STZ base
JSR setup_params
BEQ class0
LDY #$0002
JSR check_base
LDY #$0004
BRA main_entry
class0 LDY #$0002
main_entry LDA [my_pblk_ptr],Y
STA displacement
INY
INY
LDA [my_pblk_ptr],Y
STA displacement+2
JSR calc_curr_mark
BCC set_the_mark
LDA #$004D
L1555 BRL main_exit
set_the_mark JSR fill_io_buf
BCS L1555
JSR save_curr_mark
CLC
BRA L1555
setup_fat_ptr CLC
LDA my_vcr_ptr
ADC #$002F
STA fat_ptr
TAX
LDA my_vcr_ptr+2
ADC #$0000
STA fat_ptr+2
TAY
RTS
write_occurred DW $0000
free_vcr LDA [my_vcr_ptr]
JSL RELEASE_VCR
RTS
create JSR setup_params
LDA #$C000
STA search_flag
JSR process_path
BCC L1591
CMP #$0046
BNE L1595
L1591 LDA #$002B
SEC
L1595 BRL main_exit
dir_start_blk DW $0000
get_dev_num JSR setup_params
LDA $36
BNE L15BE
LDA #$4000
STA search_flag
JSR process_path
BCC L15BC
CMP #$0046
BNE L15B8
LDA $36
BNE L15BC
LDA #$0040
L15B8 SEC
BRL main_exit
L15BC LDA $00
L15BE LDY #$0004
STA [my_pblk_ptr],Y
CLC
BRL main_exit
dirty_cnt_changed DW $0000
max_pcount DW $0000
bios_parm_block DW $0000
cluster_size DB $00
reserved_sectors DW $0000
FAT_count DB $00
root_dir_count DW $0000
total_sectors DW $0000
media_desc DB $00
FAT_size DW $0000
track_size DW $0000
head_count DW $0000
hidden_sectors DW $0000
bpb_size = *-bios_parm_block
* A dir_entry record is 32-bytes long as in one_entry but...
one_entry = *
one_entry_name DS 11 ; +00
one_entry_attributes DB $00 ; +11
one_entry_reserved DS 10 ; +12
one_entry_time DW $0000 ; +22
one_entry_date DW $0000 ; +24
one_entry_start_cluster DW $0000 ; +26
one_entry_file_size ADRL $00000000 : +28
rfork_entry = *
rfork_entry_name DS 11 ; +00
rfork_entry_attributes DB $00 ; +11
rfork_entry_reserved DS 10 ; +12
rfork_entry_time DW $0000 ; +22
rfork_entry_date DW $0000 ; +24
rfork_entry_start_cluster DW $0000 ; +26
rfork_entry_file_size ADRL $00000000 : +28
rfork_entry DB $00
one_entry+last_mod_index ; ...the FST writes in the resource fork entry
DB $00
DB $00
one_entry+last_mod_index+2
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
rfork_entry_start_cluster
DW $0000
rfork_entry_file_size
ADRL $00000000
set_fcr_status LDY #$0012
ORA [msdos_fcr_ptr],Y
STA [msdos_fcr_ptr],Y
RTS
users_access DW $0000
shutdown CLC
LDAL WARM_COLD_START
BNE L1641
LDX map_buffer_vp
LDY map_buffer_vp+2
JSL RELEASE_SEG
PHP
PHA
JSL UNLOCK_MEM
PLA
PLP
L1641 RTL
map_enable_flag DW $0001
storage_type DW $0000
setup_io_buf JSR standard_req
LDY #$0006
LDA [msdos_fcr_ptr],Y
LDY #$000C
STA [msdos_fcr_ptr],Y
JSR Cluster2Block
STA $10
STZ $12
LDY #$000E
LDA #$0000
STA [msdos_fcr_ptr],Y
LDA #$8002
STA $1A
LDX data_ptr
LDY data_ptr+2
STX $04
STY $06
JSR read_with_cache
RTS
curr_mod_date ADRL $00000000
read_write_setup LDA user_cache
STA $1A
STZ tran_cnt
STZ tran_cnt+2
LDA pcount
CMP #$0005
BNE L169F
LDY #$000E
LDA [my_pblk_ptr],Y
BEQ L169F
CMP #$0001
BEQ L169D
SEC
LDA #$0053
BRL main_exit
L169D STA $1A
L169F LDY #$0002
LDA [my_pblk_ptr],Y
STA users_buf_ptr
INY
INY
LDA [my_pblk_ptr],Y
AND #$00FF
STA users_buf_ptr+2
LDY #$000A
LDA #$0000
STA [my_pblk_ptr],Y
INY
INY
STA [my_pblk_ptr],Y
LDY #$0006
LDA [my_pblk_ptr],Y
STA user_req_cnt
INY
INY
LDA [my_pblk_ptr],Y
STA user_req_cnt+2
TXA
ORA user_req_cnt
BEQ L16D1
RTS
L16D1 CLC
BRL main_exit
dir_last_blk DW $0000
def_dir_page DS $4C
send_info STX temp_ptr
STY temp_ptr+2
STA math_temp
TAX
BNE L172D
RTS
L172D LDX #$00C3
LDA one_entry_attributes
BIT #$0001
BEQ L173B
LDX #$0001
L173B BIT #$0020
BEQ L1747
PHA
TXA
ORA #$0020
TAX
PLA
L1747 BIT #$0006
BEQ L1751
TXA
ORA #$0004
TAX
L1751 LDY #$0000
TXA
STA [temp_ptr],Y
DEC math_temp
BNE L175D
end_send1 CLC
RTS
L175D LDX #$000F
LDA one_entry_attributes
BIT #$0010
BNE L176B
JSR get_file_type
L176B TXA
LDY #$0002
STA [temp_ptr],Y
DEC math_temp
BEQ end_send1
LDY #$0004
LDA #$0000
STA [temp_ptr],Y
INY
INY
STA [temp_ptr],Y
LDA one_entry_attributes
BIT #$0010
BNE L1791
JSR get_file_type
LDY #$0004
STA [temp_ptr],Y
L1791 DEC math_temp
BEQ end_send1
LDY #$0008
LDA storage_type
LSR
LSR
LSR
LSR
STA [temp_ptr],Y
DEC math_temp
BEQ end_send1
LDX #$0000
TXY
JSR unpack_time
LDY #$000A
JSR send_time
DEC math_temp
BEQ end_send1
LDX one_entry_date
LDY one_entry_time
JSR unpack_time
LDY #$0012
JSR send_time
DEC math_temp
BEQ L1804
LDY #$001A
LDA [temp_ptr],Y
TAX
INY
INY
LDA [temp_ptr],Y
TAY
BNE L17D9
TXA
BEQ L1802
L17D9 PEI temp_ptr
PEI temp_ptr+2
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
CMP #$0004
BCC opt_range_err
TAX
LDA #$0002
TAY
STA [temp_ptr],Y
TXA
CMP #$0006
BCC opt_size_error
INY
INY
LDA #$000A
STA [temp_ptr],Y
PLA
STA temp_ptr+2
PLA
STA temp_ptr
L1802 DEC math_temp
L1804 BEQ L184C
LDY #$001E
LDX one_entry_file_size+2
LDA one_entry_file_size
JSR store_longword
DEC math_temp
BEQ L184C
LDX #$0000
LDA one_entry_start_cluster
BEQ L1821
JSR count_blks_used
L1821 LDY #$0022
JSR store_longword
DEC math_temp
BEQ L184C
LDY #$0026
LDX rfork_entry_file_size+2
LDA rfork_entry_file_size
JSR store_longword
DEC math_temp
BEQ L184C
LDX #$0000
LDA rfork_entry_start_cluster
BEQ L1846
JSR count_blks_used
L1846 LDY #$002A
JSR store_longword
L184C CLC
RTS
opt_range_err PLA
STA temp_ptr+2
PLA
STA temp_ptr
LDA #$0053
SEC
RTS
opt_size_error PLA
STA temp_ptr+2
PLA
STA temp_ptr
LDA #$004F
SEC
RTS
store_longword STA [temp_ptr],Y
INY
INY
TXA
STA [temp_ptr],Y
RTS
send_time LDA minutes
XBA
STA [temp_ptr],Y
INY
INY
LDA hours
STA [temp_ptr],Y
INY
LDA year
STA [temp_ptr],Y
INY
LDA day
BEQ L1886
DEC
L1886 STA [temp_ptr],Y
INY
LDA month
BEQ L188F
DEC
L188F STA [temp_ptr],Y
INY
LDA day_of_week
XBA
STA [temp_ptr],Y
RTS
Cluster2Block PHY
PHX
TAY
BNE L18A5
LDY #$0015
LDA [msdos_vcr_ptr],Y
BRA L18C1
L18A5 DEC
DEC
PHA
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
L18B0 LSR
TAX
BCS L18BA
PLA
ASL
PHA
TXA
BRA L18B0
L18BA PLA
LDY #$001D
CLC
ADC [msdos_vcr_ptr],Y
L18C1 PLX
PLY
RTS
device_call LDA $02
CMP #$0005
BCS L18E8
CMP #$0003
BEQ L18D9
LDA $1A
AND #$7FFF
STA $1A
BRA L18E1
L18D9 STA write_occurred
LDA $00
STA write_dev_num
L18E1 LDA #$0200
STA $14
STZ $12
L18E8 JSL DEV_DISPATCHER
RTS
count_blks_used TAX
BNE real_file
LDY #$001D
LDA [msdos_vcr_ptr],Y
SEC
LDY #$0015
SBC [msdos_vcr_ptr],Y
RTS
real_file STZ math_temp+2
L18FE INC math_temp+2
JSR get_FAT_entry
BCC L18FE
LDY #$0002
LDA [msdos_vcr_ptr],Y
AND #$00FF
PHA
PHA
PHA
PEI math_temp+2
_Multiply
PLA
PLX
RTS
resource_num DW $0000
start_tbl DW $2128
DW $2122
DW $0000
DW $2124
DW $212D
DW $012D
DW $0027
DW $0027
DW $0000
DW $0000
DW $2122
DW $0000
DW $0000
DW $0000
DW $0000
DW $0130
DW $0000
DW $0E26
DW $6E26
DW $0E22
DW $2E23
DW $0E25
DW $0423
DW $7E24
DW $0423
DW $0000
DW $0000
DW $0E32
DW $0000
DW $0000
DW $0000
DW $0123
DW $0000
DW $0000
DW $0000
DW $0127
DW $0127
search_flag DW $0000
gbuf_addr ADRL $00000000
day DW $0000
move_dir_entry LDY #$001E
L1973 LDA [$04],Y
STA one_entry,Y
LDA #$0000
STA rfork_entry,Y
DEY
DEY
BPL L1973
LDY #$000B
LDA [$04],Y
BIT #$0008
BNE L19E3
LDX #$0010
BIT #$0010
BEQ L1997
LDX #$00D0
L1997 STX storage_type
SEP #$20
LDY #$0000
TYX
L19A0 LDA one_entry,Y
CMP #$20
BEQ L19B0
STA filename_text,Y
INY
CPY #$0008
BCC L19A0
L19B0 LDA #$2E
STA filename_text,Y
INY
L19B6 LDA one_entry+8,X
CMP #$20
BEQ L19C7
STA filename_text,Y
INY
INX
CPX #$0003
BCC L19B6
L19C7 TXA
BNE L19CB
DEY
L19CB STY filename_length
REP #$20
LDA $30
AND #$1FFF
CMP #$0010
BEQ L19DF
CMP #$0006
BNE L19E2
L19DF JSR chk_4_rfork
L19E2 RTS
L19E3 LDA #$00F0
STA storage_type
SEP #$20
LDA #$10
TSB one_entry_attributes
LDY #$0000
L19F3 LDA one_entry,Y
CMP #$20
BEQ L1A03
STA filename_text,Y
INY
CPY #$000B
BCC L19F3
L1A03 STY filename_length
REP #$20
RTS
chk_4_rfork JSR make_rfork_name
LDA #$4000
LDX namebuf_ptr
LDY namebuf_ptr+2
JSR build_path
LDA $00
JSR find_file
BCS L1A33
STX temp4_ptr
STY temp4_ptr+2
LDY #$001E
L1A24 LDA [temp4_ptr],Y
STA rfork_entry,Y
DEY
DEY
BPL L1A24
LDA #$0050
STA storage_type
L1A33 LDX namebuf_vp
LDY namebuf_vp+2
JSL RELEASE_SEG
RTS
get_dir_entry JSR setup_params
PHP
LDA my_pblk_ptr+2
STA temp2_ptr+2
CLC
LDA my_pblk_ptr
STA temp2_ptr
ADC #$0004
STA my_pblk_ptr
BCC L1A52
INC my_pblk_ptr+2
L1A52 PLP
BNE L1A5B
LDA #$000E
STA pcount
L1A5B LDY #$001C
LDA [msdos_fcr_ptr],Y
CMP #$00D0
BCS L1A6C
SEC
LDA #$004A
BRL main_exit
L1A6C LDY #$0002
LDA #$0000
STA [temp2_ptr],Y
JSR standard_req
LDA data_ptr
CLC
ADC #$000B
STA index_ptr
LDA data_ptr+2
ADC #$0000
STA index_ptr+2
LDA [my_pblk_ptr]
STA base
CMP #$0003
BCC L1A96
LDA #$0053
gde_exit BRL main_exit
L1A96 LDY #$0004
LDA [my_pblk_ptr],Y
STA temp_ptr
INY
INY
LDA [my_pblk_ptr],Y
AND #$00FF
STA temp_ptr+2
LDY #$0002
LDA [my_pblk_ptr],Y
STA displacement
ORA base
BNE nothing_special
JSR reset_gde
BCS gde_exit
LDY #$0020
LDA [msdos_fcr_ptr],Y
STA entry_offset
JSR send_tot_files
JSR reset_gde
BRL main_exit
nothing_special LDY #$0020
LDA [msdos_fcr_ptr],Y
STA entry_offset
LDY #$001E
LDA [msdos_fcr_ptr],Y
TAY
BEQ L1ADA
DEC
L1ADA STA math_temp
LDA base
BEQ absolute
DEC
BEQ forward
SEC
TYA
SBC displacement
BCS L1AFE
end_dir_err SEC
LDA #$0061
L1AEF BRL main_exit
absolute LDA displacement
BRA L1AFE
forward CLC
TYA
ADC displacement
BCS end_dir_err
L1AFE TAX
BEQ end_dir_err
DEC
JSR find_entry
BCS L1AEF
LDY #$001E
LDA math_temp
INC
STA [msdos_fcr_ptr],Y
LDY #$0020
LDA entry_offset
STA [msdos_fcr_ptr],Y
CLC
ADC data_ptr
STA $04
LDA data_ptr+2
ADC #$0000
STA $06
JSR move_dir_entry
LDA #$004F
STA math_temp
LDA [temp_ptr]
CMP #$0004
BCC L1B88
LDY #$0002
LDA filename_length
STA [temp_ptr],Y
CLC
ADC #$0004
CMP [temp_ptr]
BEQ L1B4F
BCC L1B4F
LDA [temp_ptr]
SBC #$0004
BEQ L1B88
BCC L1B88
BRA L1B5D
L1B4F STZ math_temp
LDA filename_length
BNE L1B5D
LDA #$0051
SEC
BRL main_exit
L1B5D TAY
CLC
LDA temp_ptr
ADC #$0003
STA temp_ptr
BCC L1B6A
INC temp_ptr+2
L1B6A STY gde_temp
LDY #$0000
SEP #$20
L1B72 LDA filename_text,Y
INY
STA [temp_ptr],Y
CPY gde_temp
BNE L1B72
REP #$20
LDA math_temp
CMP #$004F
BEQ L1B88
STZ math_temp
L1B88 STZ temp4_ptr
STZ temp4_ptr+2
LDA one_entry_attributes
AND #$001C
BEQ L1B97
BRL L1C46
L1B97 LDY #$0002
LDA [my_fcr_ptr],Y
TAX
INY
INY
LDA [my_fcr_ptr],Y
TAY
JSL DEREF
STX temp4_ptr
STY temp4_ptr+2
LDA [temp4_ptr]
CLC
ADC L25F4
CLC
ADC filename_length
CLC
ADC #$0002
JSL ALLOC_SEG
BCC L1BC4
LDA #$0054
BRL main_exit
L1BC4 STX namebuf_vp
STY namebuf_vp+2
JSL DEREF
STX namebuf_ptr
STY namebuf_ptr+2
SEP #$20
LDY #$0002
LDX #$0000
L1BD8 INY
LDA [temp4_ptr],Y
BEQ L1BF4
CMP #$3A
BNE L1BD8
L1BE1 INY
LDA [temp4_ptr],Y
BEQ L1BEE
PHY
TXY
STA [namebuf_ptr],Y
PLY
INX
BRA L1BE1
L1BEE TXY
LDA #$3A
STA [namebuf_ptr],Y
INX
L1BF4 TXY
LDX #$0000
L1BF8 LDA L25F4+2,X
STA [namebuf_ptr],Y
INX
INY
CPX L25F4
BCC L1BF8
LDX #$0000
L1C07 LDA filename_text,X
STA [namebuf_ptr],Y
INY
INX
CPX filename_length
BCC L1C07
LDA #$00
STA [namebuf_ptr],Y
REP #$20
LDA $00
LDX namebuf_ptr
LDY namebuf_ptr+2
PEI temp_ptr+2
PEI temp_ptr
JSR find_file
PLA
STA temp_ptr
PLA
STA temp_ptr+2
STZ temp4_ptr
STZ temp4_ptr+2
BCS L1C3E
STX temp4_ptr
STY temp4_ptr+2
LDY #$0002
LDA #$8000
STA [temp2_ptr],Y
L1C3E LDX namebuf_vp
LDY namebuf_vp+2
JSL RELEASE_SEG
L1C46 SEC
LDA pcount
SBC #$0005
STA pcount
BEQ L1C55
JSR send_gde_stuff
L1C55 LDA math_temp
CMP #$0001
BRL main_exit
send_gde_stuff LDA my_pblk_ptr
STA temp_ptr
LDA my_pblk_ptr+2
STA temp_ptr+2
LDY #$0008
LDA find_this_entry
INC
STA [temp_ptr],Y
DEC pcount
BEQ L1C8A
LDY #$000A
LDX #$000F
LDA storage_type
CMP #$00D0
BCS L1C84
JSR get_file_type
L1C84 TXA
STA [temp_ptr],Y
DEC pcount
L1C8A BNE L1C8F
BRL L1D14
L1C8F JSR send_data_eof
DEC pcount
BEQ L1D14
JSR send_data_blks
DEC pcount
BEQ L1D14
LDX #$0000
TXY
JSR unpack_time
LDY #$0014
JSR send_time
DEC pcount
BEQ L1D14
LDX one_entry_date
LDY one_entry_time
JSR unpack_time
LDY #$001C
JSR send_time
DEC pcount
BEQ L1D14
LDX #$00E3
LDA one_entry_attributes
BIT #$0001
BEQ L1CD3
LDX #$0001
L1CD3 BIT #$0020
BEQ L1CDF
PHA
TXA
ORA #$0020
TAX
PLA
L1CDF BIT #$0002
BEQ L1CE9
TXA
ORA #$0004
TAX
L1CE9 TXA
LDY #$0024
STA [temp_ptr],Y
DEC pcount
BEQ L1D14
LDA #$0000
LDY #$0026
STA [temp_ptr],Y
INY
INY
STA [temp_ptr],Y
LDA storage_type
CMP #$00D0
BCS L1D11
JSR get_file_type
DEY
DEY
STA [temp_ptr],Y
INY
INY
L1D11 DEC pcount
L1D14 BEQ L1D76
LDA #$000A
LDY #$002A
STA [temp_ptr],Y
DEC pcount
BEQ L1D76
LDY #$002C
LDA [temp_ptr],Y
TAX
INY
INY
LDA [temp_ptr],Y
TAY
BNE L1D33
TXA
BEQ L1D66
L1D33 PEI temp_ptr
PEI temp_ptr+2
STX temp_ptr
STY temp_ptr+2
LDA [temp_ptr]
CMP #$0004
BCS L1D47
LDA #$0053
BRA L1D77
L1D47 TAX
LDA #$0002
TAY
STA [temp_ptr],Y
TXA
CMP #$0006
BCS L1D59
LDA #$004F
BRA L1D77
L1D59 INY
INY
LDA #$000A
STA [temp_ptr],Y
PLA
STA temp_ptr+2
PLA
STA temp_ptr
L1D66 DEC pcount
BEQ L1D76
JSR send_res_eof
DEC pcount
BEQ L1D76
JSR send_res_blks
L1D76 RTS
L1D77 STA math_temp
PLA
STA temp_ptr+2
PLA
STA temp_ptr
RTS
send_data_eof LDY #$000C
LDA one_entry_file_size
STA [temp_ptr],Y
INY
INY
LDA one_entry_file_size+2
STA [temp_ptr],Y
RTS
send_data_blks LDX #$0000
LDA one_entry_start_cluster
BEQ L1D9B
JSR count_blks_used
L1D9B LDY #$0010
STA [temp_ptr],Y
INY
INY
TXA
STA [temp_ptr],Y
RTS
send_res_eof LDA temp4_ptr
ORA temp4_ptr+2
TAX
BEQ L1DB7
LDY #$001E
LDA [temp4_ptr],Y
TAX
DEY
DEY
LDA [temp4_ptr],Y
L1DB7 LDY #$0030
STA [temp_ptr],Y
INY
INY
TXA
STA [temp_ptr],Y
RTS
send_res_blks LDA temp4_ptr
ORA temp4_ptr+2
TAX
BEQ L1DD1
LDY #$001A
LDA [temp4_ptr],Y
JSR count_blks_used
L1DD1 LDY #$0034
STA [temp_ptr],Y
INY
INY
TXA
STA [temp_ptr],Y
RTS
add_entry_len TYA
CLC
ADC #$0020
TAY
RTS
sub_entry_len TYA
SEC
SBC #$0020
TAY
RTS
send_tot_files LDA pcount
CMP #$0006
BCC L1E04
LDA #$0001
STA math_temp
LDA #$FFFF
JSR find_entry
LDA math_temp
LDY #$0008
STA [my_pblk_ptr],Y
L1E04 RTS
reset_gde LDY #$0006
LDA [msdos_fcr_ptr],Y
LDY #$000C
CMP [msdos_fcr_ptr],Y
BNE L1E1A
TAX
LDY #$000E
LDA [msdos_fcr_ptr],Y
BEQ L1E2F
TXA
L1E1A LDY #$000C
STA [msdos_fcr_ptr],Y
LDY #$000E
LDA #$0000
STA [msdos_fcr_ptr],Y
JSR read_gde_blk
BCS L1E5D
LDA #$0000
L1E2F LDY #$0020
STA [msdos_fcr_ptr],Y
LDY #$001E
STA [msdos_fcr_ptr],Y
LDY #$0006
LDA [msdos_fcr_ptr],Y
BEQ L1E5C
LDA [data_ptr]
AND #$00FF
CMP #$002E
BNE L1E5E
LDY #$0020
LDA [data_ptr],Y
CMP #$2E2E
BNE L1E5E
LDA #$0040
LDY #$0020
STA [msdos_fcr_ptr],Y
L1E5C CLC
L1E5D RTS
L1E5E SEC
LDA #$0051
BRL main_exit
read_gde_blk LDY #$000C
LDA [msdos_fcr_ptr],Y
JSR Cluster2Block
CLC
LDY #$000E
ADC [msdos_fcr_ptr],Y
STA $10
LDA my_fcr_ptr
ADC #$0038
STA $04
LDA my_fcr_ptr+2
ADC #$0000
STA $06
JSR read_with_cache
RTS
load_ext_blk JSR set_default_buf
JSR standard_req
LDA one_entry+key_blk_index
STA $10
JSR read_with_cache
BCC L1E9A
BRL main_exit
L1E9A RTS
find_entry LDY entry_offset
STA find_this_entry
CMP math_temp
BEQ L1EDA
BCC L1F16
L1EA7 CPY #$01E0
BCS L1EDE
JSR add_entry_len
L1EAF LDA [data_ptr],Y
AND #$00FF
BEQ L1F11
CMP #$00E5
BEQ L1EA7
CMP #$002E ; .
BEQ L1EA7
LDA [index_ptr],Y
BIT #$0008
BNE L1EA7
JSR chkResName
BCS L1EA7
STY entry_offset
INC math_temp
LDA math_temp
CMP find_this_entry
BNE L1EA7
L1ED8 CLC
RTS
L1EDA DEC math_temp
BRA L1EAF
L1EDE LDY #$000E
LDA [msdos_fcr_ptr],Y
INC
STA [msdos_fcr_ptr],Y
LDY #$0010
CMP [msdos_fcr_ptr],Y
BCC L1F06
LDY #$000C
LDA [msdos_fcr_ptr],Y
BEQ L1F11
JSR get_FAT_entry
BCS L1F11
LDY #$000C
STA [msdos_fcr_ptr],Y
LDA #$0000
LDY #$000E
STA [msdos_fcr_ptr],Y
L1F06 JSR read_gde_blk
LDY #$0000
BCC L1EAF
BRL main_exit
L1F11 SEC
LDA #$0061
RTS
L1F16 TYA
BEQ L1F40
JSR sub_entry_len
L1F1C LDA [data_ptr],Y
AND #$00FF
BEQ L1F11
CMP #$00E5
BEQ L1F16
CMP #$002E
BEQ L1F16
JSR chkResName
BCS L1F16
STY entry_offset
DEC math_temp
LDA math_temp
CMP find_this_entry
BNE L1F16
BRA L1ED8
L1F40 LDY #$000E
LDA [msdos_fcr_ptr],Y
BNE L1F5D
JSR reset_gde
LDY #$001E
LDA [msdos_fcr_ptr],Y
STA math_temp
LDY #$0020
LDA [msdos_fcr_ptr],Y
STA entry_offset
TAY
BRL L1EAF
L1F5D DEC
STA [msdos_fcr_ptr],Y
JSR read_gde_blk
LDY #$01E0
BCC L1F1C
BRL main_exit
chkResName PHY
TYA
CLC
ADC #$000A
TAY
LDX #$000A
SEP #$20
L1F77 LDA L1F89,X
CMP [data_ptr],Y
BNE L1F83+1
DEY
DEX
BPL L1F77
SEC
L1F83 BCC gstring+9
REP #$20
PLY
RTS
L1F89 ASC 'RESOURCEFRK'
gstring DS $14
user_cache DW $0000
cp_device_flag DW $0000
num_seq_blks JSR get_data_num
STA index_ptr+2
LDY #$0010
SEC
SBC [msdos_fcr_ptr],Y
EOR #$FFFF
INC
STA math_temp
PHX
TXA
INC
STA entries_checked
L1FC3 TXA
JSR get_FAT_entry
BCS L1FDF
CMP entries_checked
BNE L1FDF
TAX
INC
STA entries_checked
LDY #$0010
CLC
LDA [msdos_fcr_ptr],Y
ADC math_temp
STA math_temp
BRA L1FC3
L1FDF PLX
LDY index_ptr+2
LDA math_temp
RTS
base DW $0000
find_volume LDA #$0001
STA search_device
STZ skip_dev
JSR chk_vol_syntax
LDX #volume_name
LDY #^volume_name
LDA #$0000
JSL FIND_VCR
BCS L2026
JSL DEREF
STX my_vcr_ptr
STY my_vcr_ptr+2
LDY #$000A
LDA [my_vcr_ptr],Y
CMP #$000A ; fst_id
BEQ L2019
LDA #$0052
SEC
RTS
L2019 LDY #$000C
LDA [my_vcr_ptr],Y
STA search_device
STA skip_dev
BRA L202E
L2026 LDA search_device
CMP skip_dev
BEQ L2044
L202E JSR id_disk
BCC L2049
CMP #$0011
BEQ L203F
CMP #$0057
BEQ L2042
BRA L207B
L203F LDA #$0045
L2042 SEC
RTS
L2044 INC search_device
BRA L2026
L2049 LDA gstring
CMP volume_name
BNE L207B
TAY
PHP
SEP #$20
L2055 LDA gstring+1,Y
EOR volume_name+1,Y
BEQ L2074
CMP #$20
BNE L207A
LDA gstring+1,Y
CMP #$41
BCC L207A
CMP #$5B
BCC L2074
CMP #$61
BCC L207A
CMP #$7B
BCS L207A
L2074 DEY
BNE L2055
PLP
CLC
RTS
L207A PLP
L207B LDA skip_dev
CMP search_device
BNE L2044
STZ search_device
BRA L2044
chk_vol_syntax SEP #$30
LDY volume_name
CPY #$0C
BCS L209E
L2091 LDA volume_name+1,Y
CMP #$3A
BEQ L209E
DEY
BNE L2091
REP #$31
RTS
L209E REP #$30
LDA #$0040
BRL main_exit
search_device DW $0000
skip_dev DW $0000
mount_volume JSR save_the_world
JSR setup_vol_mesg
L20B0 JSR find_volume
BCC L20BE
JSR issue_mount
BCC L20B0
JSR restore_world
RTS
L20BE LDA $00
JSR restore_world
STA $00
LDY #$000C
STA [my_vcr_ptr],Y
LDY #$0006
LDA [my_vcr_ptr],Y
AND #$BFFF
STA [my_vcr_ptr],Y
CLC
RTS
save_the_world PHP
PHY
PHX
PHA
LDA world_flag
BNE L211C
INC world_flag
LDX #$004A
L20E5 LDA $00,X
STA direct_page,X
DEX
BPL L20E5
LDX #$0052
L20F0 LDA fst_start,X
STA my_direct,X
DEX
BPL L20F0
BRA L2117
restore_world PHP
PHY
PHX
PHA
LDX #$004A
L2101 LDA direct_page,X
STA $00,X
DEX
BPL L2101
LDX #$0052
L210C LDA my_direct,X
STA fst_start,X
DEX
BPL L210C
DEC world_flag
L2117 PLA
PLX
PLY
PLP
RTS
L211C JSL SYS_DEATH
search_name DS $B
cp_flags DW $0000
direct_page DS $4C
setup_curr_eof LDY #$0008
LDA [msdos_fcr_ptr],Y
STA curr_eof
INY
INY
LDA [msdos_fcr_ptr],Y
STA curr_eof+2
RTS
minutes DW $0000
map_buffer_vp ADRL $00000000
dummy_name ASC 'cant.find.me'
DW $0000
issue_mount LDA volume_name
XBA
STA volume_name
PEA ^volume_name
PEA volume_name+1
LDA #$0001
JSL MOUNT_MESSAGE
TAX
LDA volume_name
XBA
STA volume_name
TXA
BNE L21BE
CLC
RTS
L21BE SEC
LDA #$0045
RTS
find_this_entry DW $0000
map_enable LDY #$0006
LDA [$32],Y
CMP map_enable_flag
STA map_enable_flag
BEQ L21D5
JSR post_volume_changed
L21D5 CLC
RTS
activate_vcr LDY #$0006
LDA [my_vcr_ptr],Y
AND #$BFFF
STA [my_vcr_ptr],Y
RTS
entry_sto_type DW $0000
rw_adjust CLC
LDA users_buf_ptr
ADC $08
STA users_buf_ptr
LDA users_buf_ptr+2
ADC $0A
STA users_buf_ptr+2
LDA tran_cnt
ADC $08
STA tran_cnt
LDA tran_cnt+2
ADC $0A
STA tran_cnt+2
LDA curr_mark
ADC $08
STA curr_mark
LDA curr_mark+2
ADC $0A
STA curr_mark+2
SEC
LDA user_req_cnt
SBC $08
STA user_req_cnt
LDA user_req_cnt+2
SBC $0A
STA user_req_cnt+2
RTS
length DW $0000
newline_len DW $0000
check_dup STZ fcr_wanted
LDX one_entry_start_cluster
LDA resource_num
BEQ L2235
LDX rfork_entry_start_cluster
L2235 STX key_block
L2238 JSR get_next_fcr
BCS L2271
LDY #$0008
LDA [my_fcr_ptr],Y
CMP [my_vcr_ptr]
BNE L2238
LDY #$0006
LDA [msdos_fcr_ptr],Y
CMP key_block
BNE L2238
LDY #$0014
LDA [my_fcr_ptr],Y
AND #$3FFF
CMP #$0002
BCS L2267
LDA users_access
BEQ L226B
CMP #$0002
BCC L226A
L2267 LDA #$0050
L226A RTS
L226B LDA #$0001
STA access
L2271 CLC
RTS
setup_io_ptrs STZ data_ptr
STZ data_ptr+2
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$4000
BEQ L2290
CLC
LDA my_fcr_ptr
ADC #$0038
STA data_ptr
LDA my_fcr_ptr+2
ADC #$0000
STA data_ptr+2
L2290 RTS
entries_blk_num DW $0000
free_dir_offset DW $0000
flush_file STZ flush_entry
BRA cont_flush
do_fast_flush LDA #$0001
BRA stuffit
flush_io_buffer LDA #$FFFF
stuffit STA flush_entry
cont_flush CLC
RTS
get_map_size JSR deref_map
LDA [map_ptr]
LDY #$0006
STA [$32],Y
CLC
RTS
get_next_fcr LDA fcr_wanted
INC
STA fcr_wanted
JSL GET_FCR
BCS L22D6
JSL DEREF
STX my_fcr_ptr
STY my_fcr_ptr+2
LDY #$0006
LDA [my_fcr_ptr],Y
CMP #$000A
BNE get_next_fcr
JSR setup_my_fcr
CLC
L22D6 RTS
dev_with_mount JSR device_call
BCS L22DD
RTS
L22DD CMP #$002E
BEQ L22E9
CMP #$002F
BEQ L22E9
SEC
RTS
L22E9 JSR mount_volume
BCC dev_with_mount
RTS
get_FAT_entry PHA
LDY #$001B
LDA [msdos_vcr_ptr],Y
BNE L2310
LDA $01,S
LSR
PHP
CLC
ADC $02,S
TAY
LDA [fat_ptr],Y
PLP
BCC L2308
LSR
LSR
LSR
LSR
L2308 AND #$0FFF
PLY
CMP #$0FF0
RTS
L2310 LDA $01,S
ASL
TAY
LDA [fat_ptr],Y
PLY
CMP #$FFF0
RTS
access DW $0000
calc_curr_mark JSR setup_curr_eof
JSR setup_curr_mark
LDA base
BEQ L2374
DEC
BEQ L2346
DEC
BEQ L235D
SEC
LDA curr_mark
SBC displacement
STA curr_mark
LDA curr_mark+2
SBC displacement+2
STA curr_mark+2
BCS L235B
L2343 SEP #$41
RTS
L2346 SEC
LDA curr_eof
SBC displacement
STA curr_mark
LDA curr_eof+2
SBC displacement+2
STA curr_mark+2
BCC L2343
L235B CLC
RTS
L235D CLC
LDA curr_mark
ADC displacement
STA curr_mark
LDA curr_mark+2
ADC displacement+2
STA curr_mark+2
BCC L2380
L2372 CLV
RTS
L2374 LDA displacement
STA curr_mark
LDA displacement+2
STA curr_mark+2
L2380 LDA curr_mark+2
CMP curr_eof+2
BEQ L238B
BCS L2372
RTS
L238B LDA curr_mark
CMP curr_eof
BEQ L2395
BCS L2372
L2395 CLC
RTS
expand_record_expand_flag
DW $0000
expand_record_expand_file
DW $0000
expand_record_expand_storage
DW $0000
expand_record_expand_key_blk
DW $0000
expand_record_expand_blks_used
DW $0000
expand_record_expand_eof
ADRL $00000000
set_map_table LDA map_buffer_vp
LDX map_buffer_vp+2
STA index_ptr
STX index_ptr+2
LDY #$0006
LDA [$32],Y
STA temp_ptr
INY
INY
LDA [$32],Y
STA temp_ptr+2
LDA [temp_ptr]
JSL ALLOC_SEG
LDA #$0054
BCS L23F1
STX map_buffer_vp
STY map_buffer_vp+2
JSL DEREF
STX map_ptr
STY map_ptr+2
LDA [temp_ptr]
TAY
SEP #$20
L23DA DEY
BMI L23E3
LDA [temp_ptr],Y
STA [map_ptr],Y
BRA L23DA
L23E3 REP #$20
LDX index_ptr
LDY index_ptr+2
JSL RELEASE_SEG
JSR post_volume_changed
CLC
L23F1 RTS
get_map_table JSR deref_map
LDY #$0006
LDA [$32],Y
STA temp_ptr
INY
INY
LDA [$32],Y
STA temp_ptr+2
LDA [map_ptr]
TAY
SEP #$20
L2407 DEY
BMI L2410
LDA [map_ptr],Y
STA [temp_ptr],Y
BRA L2407
L2410 REP #$20
CLC
RTS
class DW $0000
check_base LDA [my_pblk_ptr],Y
CMP #$0004
BCS L2421
STA base
RTS
L2421 LDA #$0053
BRL main_exit
post_volume_changed LDA #$0001
L242A JSL GET_VCR
BCS L2465
JSL DEREF
STX temp_ptr
STY temp_ptr+2
LDY #$000A
LDA [temp_ptr],Y
CMP #$000A
BNE L2460
LDY #$0006
LDA [temp_ptr],Y
AND #$4000
BNE L2460
PEA $2033
LDY #$000C
LDA [temp_ptr],Y
PHA
PHA
LDA #$0040
LDX #$0000
JSL POST_OS_EVENT
L2460 LDA #$0000
BRA L242A
L2465 RTS
year DW $0000
fill_io_buf STZ mark_changed
JSR setup_curr_eof
LDA curr_mark
ORA curr_mark+2
BEQ mark_ok
LDA curr_mark+2
CMP curr_eof+2
BCC mark_ok
LDA curr_mark
CMP curr_eof
BCC mark_ok
SBC #$0001
STA curr_mark
LDA curr_mark+2
SBC #$0000
STA curr_mark+2
DEC mark_changed
mark_ok JSR standard_req
JSR get_data_num
STX index_ptr
STA index_ptr+2
LDY #$000E
CMP [msdos_fcr_ptr],Y
BNE load_data
LDY #$000C
TXA
CMP [msdos_fcr_ptr],Y
BEQ exit_fill_data
load_data JSR chk_data_clean
BCS outta_here
LDA index_ptr
JSR Cluster2Block
CLC
ADC index_ptr+2
STA $10
STZ $12
LDA data_ptr
STA $04
LDA data_ptr+2
STA $06
JSR read_with_mount
BCS outta_here
store_data_num LDY #$000C
LDA index_ptr
STA [msdos_fcr_ptr],Y
LDY #$000E
LDA index_ptr+2
STA [msdos_fcr_ptr],Y
exit_fill_data CLC
outta_here PHP
PHA
BIT mark_changed
BPL no_change
INC curr_mark
BNE no_change
INC curr_mark+2
no_change PLA
PLP
RTS
get_data_num LDA curr_mark+3
LSR
LDA curr_mark+1
ROR
PHA
LDY #$0006
LDA [msdos_fcr_ptr],Y
TAX
L24FF LDY #$0010
LDA $01,S
CMP [msdos_fcr_ptr],Y
BEQ L250A
BCC L2516
L250A SEC
SBC [msdos_fcr_ptr],Y
STA $01,S
TXA
JSR get_FAT_entry
TAX
BRA L24FF
L2516 PLA
RTS
chk_data_clean CLC
PHY
LDY #$0012
LDA [msdos_fcr_ptr],Y
AND #$0004
BEQ L2524
L2524 PLY
RTS
check_spans LDA $42
AND #$4000
BEQ L253D
LDA $44
BEQ L2536
CMP #$000D
BCC L253D
L2536 SEC
L2537 LDA #$0040
BRL main_exit
L253D LDA $42
AND #$0040
BEQ L254D
LDA $46
BEQ L2536
CMP #$000D
BCS L2537
L254D RTS
and_mask DW $0000
my_direct DS $78
vol_to_buffer LDY #$0001
L25CB LDA [temp_ptr],Y
AND #$00FF
BEQ L25E7
CMP #$003A
BEQ L25E7
STA volume_name+1,Y
INY
CPY #$000D
BCC L25CB
LDA #$0040
SEC
BRL main_exit
L25E7 TAX
LDA #$0000
STA volume_name+1,Y
DEY
STY volume_name
TXA
RTS
L25F4 STRL 'RESOURCE.FRK:'
unpack_time STX pro_time
STY pro_time+2
JSR zero_date
TXA
ORA pro_time+2
BEQ L268E
LDA pro_time
AND #$001F
STA day
CMP #$0020
BCS zero_date
TAY
TXA
LSR
LSR
LSR
LSR
LSR
AND #$000F
STA month
CMP #$000D
BCS zero_date
TAX
LDA pro_time
XBA
LSR
AND #$007F
CLC
ADC #$0050
STA year
JSR dow_convert
STA day_of_week
LDA pro_time+2
AND #$000F
ASL
STA seconds
CMP #$003C
BCS zero_date
LDA pro_time+2
LSR
LSR
LSR
LSR
LSR
AND #$003F
STA minutes
CMP #$003C
BCS zero_date
LDA pro_time+2
XBA
LSR
LSR
LSR
AND #$001F
STA hours
CMP #$0018
BCC L268E
zero_date STZ hours
STZ minutes
STZ year
STZ month
STZ day
STZ day_of_week
L268E RTS
hours DW $0000
displacement ADRL $00000000
flush_entry DW $0000
month DW $0000
day_of_week DW $0000
world_flag DW $0000
make_rfork_name PEI math_temp
LDA [$3A]
CLC
ADC #$0019
JSL ALLOC_SEG
BCC L26AE
BRL main_exit
L26AE STX namebuf_vp
STY namebuf_vp+2
JSL DEREF
STX namebuf_ptr
STY namebuf_ptr+2
LDA [$3A]
INC
STA temp4_ptr
INC temp4_ptr
TAY
SEP #$20
LDA #$3A
L26C6 DEY
CPY #$0002
BCC L26D0
CMP [$3A],Y
BNE L26C6
L26D0 INY
STY math_temp
CPY #$0002
BEQ L26E4
LDY #$0002
L26DB LDA [$3A],Y
STA [namebuf_ptr],Y
INY
CPY math_temp
BCC L26DB
L26E4 LDX #$0000
L26E7 LDA L25F4+2,X
STA [namebuf_ptr],Y
INY
INX
CPX L25F4
BCC L26E7
TYX
LDY math_temp
L26F6 LDA [$3A],Y
PHY
TXY
STA [namebuf_ptr],Y
INX
PLY
INY
CPY temp4_ptr
BCC L26F6
LDA #$00
TXY
STA [namebuf_ptr],Y
REP #$20
TXA
DEC
DEC
STA [namebuf_ptr]
PLA
STA math_temp
RTS
gde_temp DW $0000
seconds DW $0000
key_block DW $0000
mark_changed DW $0000
dow_convert PHP
SEP #$30
PHY
TAY
LSR
LSR
STA dow_temp
TYA
AND #$03
BNE L272F
CPX #$03
BCS L272F
DEY
L272F CLC
TYA
ADC dow_temp
ADC dow_temp,X
ADC $01,S
PLY
SEC
L273B SBC #$07
CMP #$08
BCS L273B
PLP
MX %00
RTS
dow_temp DB $00
wkmon HEX 080B0B07090C070A0D080B0D
pro_time ADRL $00000000
*-------------------------------------------