mirror of
https://github.com/mi57730/a2d.git
synced 2024-11-01 10:05:56 +00:00
2511 lines
55 KiB
ArmAsm
2511 lines
55 KiB
ArmAsm
.setcpu "6502"
|
|
|
|
.org $2000
|
|
|
|
.include "apple2.inc"
|
|
.include "../inc/apple2.inc"
|
|
.include "../inc/prodos.inc"
|
|
.include "../macros.inc"
|
|
|
|
;;; ============================================================
|
|
.proc bootstrap
|
|
|
|
jmp start
|
|
|
|
;;; ============================================================
|
|
;;; Data buffers and param blocks
|
|
|
|
date: .word 0 ; written into file
|
|
|
|
L2005:
|
|
.res 832, 0
|
|
|
|
.byte $02,$00
|
|
.addr L2363
|
|
|
|
.proc get_prefix_params2
|
|
param_count: .byte 2 ; GET_PREFIX, but param_count is 2 ??? Bug???
|
|
data_buffer: .addr $0D00
|
|
.endproc
|
|
|
|
DEFINE_GET_FILE_INFO_PARAMS get_file_info_params4, $0D00
|
|
.byte $00,$01
|
|
.addr L2362
|
|
L2362: .byte $00
|
|
L2363: .res 15, 0
|
|
|
|
butn1: .byte 0 ; written, but not read
|
|
|
|
unit_num:
|
|
.byte 0
|
|
|
|
DEFINE_ON_LINE_PARAMS on_line_params,, on_line_buffer
|
|
|
|
copy_flag:
|
|
.byte 0
|
|
L2379: .byte 0
|
|
|
|
on_line_buffer: .res 17, 0
|
|
|
|
DEFINE_GET_PREFIX_PARAMS get_prefix_params, buffer
|
|
DEFINE_SET_PREFIX_PARAMS set_prefix_params, path0
|
|
|
|
.byte $0A
|
|
.addr L2379
|
|
.byte $00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00
|
|
|
|
.byte $07,$60,$2B,$C3,$0F
|
|
.byte $00,$00,$0D,$00,$00,$00,$00,$04
|
|
.byte $00,$00,$03,$00,$01,$00,$00,$01
|
|
.byte $00,$03,$F5,$26,$00,$08,$00,$04
|
|
.byte $00
|
|
.addr L23C9
|
|
.byte $04,$00,$00,$00
|
|
L23C9: .byte $00
|
|
.byte $00,$00,$00,$01,$00,$04,$00,$21
|
|
.byte $28,$27,$00,$00,$00,$04,$00
|
|
.addr L23DF
|
|
.byte $05,$00,$00,$00
|
|
L23DF: .byte $00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00
|
|
|
|
DEFINE_CLOSE_PARAMS close_srcfile_params
|
|
DEFINE_CLOSE_PARAMS close_dstfile_params
|
|
|
|
.byte $01
|
|
.addr buffer
|
|
|
|
copy_buffer := $4000
|
|
max_copy_count := MLI - copy_buffer
|
|
|
|
DEFINE_OPEN_PARAMS open_srcfile_params, buffer, $0D00
|
|
DEFINE_OPEN_PARAMS open_dstfile_params, path0, $1100
|
|
DEFINE_READ_PARAMS read_srcfile_params, copy_buffer, max_copy_count
|
|
DEFINE_WRITE_PARAMS write_dstfile_params, copy_buffer, max_copy_count
|
|
|
|
DEFINE_CREATE_PARAMS create_params, path0, ACCESS_DEFAULT, 0, 0
|
|
.byte $07
|
|
.addr path0
|
|
.byte $00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00
|
|
|
|
DEFINE_GET_FILE_INFO_PARAMS get_file_info_params, buffer
|
|
.byte 0
|
|
|
|
|
|
;; Files/Directories to copy
|
|
str_f1: PASCAL_STRING "DESKTOP1"
|
|
str_f2: PASCAL_STRING "DESKTOP2"
|
|
str_f3: PASCAL_STRING "DESK.ACC"
|
|
str_f4: PASCAL_STRING "SELECTOR.LIST"
|
|
str_f5: PASCAL_STRING "SELECTOR"
|
|
str_f6: PASCAL_STRING "PRODOS"
|
|
|
|
filename_table:
|
|
.addr str_f1,str_f2,str_f3,str_f4,str_f5,str_f6
|
|
|
|
str_copying_to_ramcard:
|
|
PASCAL_STRING "Copying Apple II DeskTop into RAMCard"
|
|
|
|
;; Jump target from filer launcher - why???
|
|
rts1: rts
|
|
|
|
;; Signature of block storage devices ($Cn0x)
|
|
sig_bytes:
|
|
.byte $20,$00,$03,$00
|
|
sig_offsets:
|
|
.byte $01,$03,$05,$07
|
|
|
|
active_device:
|
|
.byte 0
|
|
|
|
;; Selector signature
|
|
selector_signature:
|
|
.byte $AD,$8B,$C0,$18,$FB,$5C,$04,$D0,$E0
|
|
|
|
;;; ============================================================
|
|
|
|
start: sta MIXCLR
|
|
sta HIRES
|
|
sta TXTCLR
|
|
sta CLR80VID
|
|
sta AN3_OFF
|
|
sta AN3_ON
|
|
sta AN3_OFF
|
|
sta AN3_ON
|
|
sta SET80VID
|
|
sta DHIRESON
|
|
sta TXTSET
|
|
|
|
lda DATELO ; Any date set?
|
|
ora DATEHI
|
|
bne L24EB
|
|
copy16 date, DATELO ; Copy timestamp embedded in this file
|
|
L24EB: lda MACHID
|
|
and #$30 ; bits 4,5 set = 128k
|
|
cmp #$30
|
|
beq have128k
|
|
|
|
;; Relocate FILER launch routine to $300 and invoke
|
|
.scope
|
|
target := $300
|
|
length := $D0
|
|
|
|
ldy #length
|
|
: lda launch_filer,y
|
|
sta target,y
|
|
dey
|
|
cpy #$FF ; why not bpl ???
|
|
bne :-
|
|
jmp target
|
|
.endscope
|
|
|
|
have128k:
|
|
lda #$00
|
|
sta SHADOW ; IIgs ???
|
|
|
|
lda DEVNUM ; Most recent device
|
|
sta active_device
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
|
|
;; Check quit routine
|
|
ldx #$08
|
|
: lda SELECTOR,x ; Quit routine?
|
|
cmp selector_signature,x
|
|
bne nomatch
|
|
dex
|
|
bpl :-
|
|
lda #0
|
|
beq match
|
|
|
|
nomatch:
|
|
lda #$80
|
|
|
|
match: sta $D3AC
|
|
|
|
lda ROMIN2
|
|
ldx #$00
|
|
jsr L26A5
|
|
|
|
;; Point $8 at $C100
|
|
lda #0
|
|
sta flag
|
|
sta $08
|
|
lda #$C1
|
|
sta $08+1
|
|
|
|
;; Check slot for signature bytes
|
|
check_slot:
|
|
ldx #0
|
|
: lda sig_offsets,x ; Check $CnXX
|
|
tay
|
|
lda ($08),y
|
|
cmp sig_bytes,x
|
|
bne next_slot
|
|
inx
|
|
cpx #4 ; number of signature bytes
|
|
bcc :-
|
|
|
|
ldy #$FB
|
|
lda ($08),y ; Also check $CnFB for low bit
|
|
and #$01
|
|
beq next_slot
|
|
bne found_slot
|
|
|
|
next_slot:
|
|
inc $08+1
|
|
lda $08+1
|
|
cmp #$C8 ; stop at $C800
|
|
bcc check_slot
|
|
|
|
|
|
ldy DEVCNT
|
|
L2565: lda DEVLST,y
|
|
cmp #$3E
|
|
beq L2572
|
|
dey
|
|
bpl L2565
|
|
jmp fail
|
|
|
|
L2572: lda #$03
|
|
bne L257A
|
|
found_slot:
|
|
lda $08+1
|
|
and #$0F ; slot # in A
|
|
L257A: sta slot
|
|
|
|
;; Synthesize unit_num, verify it's a device
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
sta on_line_params::unit_num
|
|
sta unit_num
|
|
MLI_CALL ON_LINE, on_line_params
|
|
beq :+
|
|
jmp fail
|
|
|
|
: lda unit_num
|
|
cmp #$30 ; make sure it's not slot 3 (aux)
|
|
beq :+
|
|
sta write_block_params_unit_num
|
|
sta write_block_params2_unit_num
|
|
MLI_CALL WRITE_BLOCK, write_block_params
|
|
bne :+
|
|
MLI_CALL WRITE_BLOCK, write_block_params2
|
|
: lda on_line_buffer
|
|
and #$0F
|
|
tay
|
|
iny
|
|
sty path0
|
|
lda #'/'
|
|
sta on_line_buffer
|
|
sta path0+1
|
|
L25BF: lda on_line_buffer,y
|
|
sta path0+1,y
|
|
dey
|
|
bne L25BF
|
|
ldx #$C0
|
|
jsr L26A5
|
|
addr_call L26B2, path0
|
|
jsr check_desktop2_on_device
|
|
bcs L25E4
|
|
ldx #$80
|
|
jsr L26A5
|
|
jsr L2B57
|
|
jmp fail
|
|
|
|
L25E4: lda BUTN1
|
|
sta butn1
|
|
lda BUTN0
|
|
bpl start_copy
|
|
jmp fail
|
|
|
|
str_slash_desktop:
|
|
PASCAL_STRING "/DeskTop"
|
|
|
|
;; Overwrite first bytes of get_file_info_params
|
|
.proc file_info_ovl
|
|
.byte $A ; param_count
|
|
.addr 0 ; pathname
|
|
.byte ACCESS_DEFAULT ; access
|
|
.byte FT_DIRECTORY ; filetype
|
|
.word 0 ; aux_type
|
|
.byte ST_LINKED_DIRECTORY ; storage_type
|
|
.endproc
|
|
|
|
start_copy:
|
|
jsr show_copying_screen
|
|
MLI_CALL GET_PREFIX, get_prefix_params
|
|
beq L2611
|
|
jmp fail_copy
|
|
|
|
L2611: dec buffer
|
|
ldx #$80
|
|
jsr L26A5
|
|
ldy buffer
|
|
L261C: lda buffer,y
|
|
sta L2005,y
|
|
dey
|
|
bpl L261C
|
|
ldy path0
|
|
ldx #$00
|
|
L262A: iny
|
|
inx
|
|
lda str_slash_desktop,x
|
|
sta path0,y
|
|
cpx str_slash_desktop
|
|
bne L262A
|
|
sty path0
|
|
ldx #7
|
|
L263C: lda file_info_ovl,x
|
|
sta get_file_info_params,x
|
|
dex
|
|
cpx #3
|
|
bne L263C
|
|
jsr create_file_for_copy
|
|
lda path0
|
|
sta copy_flag
|
|
lda #0
|
|
sta filenum
|
|
|
|
file_loop:
|
|
lda filenum
|
|
asl a
|
|
tax
|
|
lda filename_table,x
|
|
sta $06
|
|
lda filename_table+1,x
|
|
sta $06+1
|
|
ldy #0
|
|
lda ($06),y
|
|
tay
|
|
: lda ($06),y
|
|
sta filename_buf,y
|
|
dey
|
|
bpl :-
|
|
jsr copy_file
|
|
inc filenum
|
|
lda filenum
|
|
cmp #$06
|
|
bne file_loop
|
|
jmp fail2
|
|
|
|
fail2: lda copy_flag
|
|
beq L268F
|
|
sta path0
|
|
MLI_CALL SET_PREFIX, set_prefix_params
|
|
L268F: jsr write_desktop1
|
|
jsr L2B57
|
|
lda #$00
|
|
sta $C071 ; ???
|
|
ldy #BITMAP_SIZE-1
|
|
: sta BITMAP,y
|
|
dey
|
|
bpl :-
|
|
jmp part2
|
|
|
|
L26A5: lda LCBANK2
|
|
lda LCBANK2
|
|
stx $D3FF
|
|
lda ROMIN2
|
|
rts
|
|
|
|
L26B2: stax $06
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
ldy #$00
|
|
lda ($06),y
|
|
tay
|
|
: lda ($06),y
|
|
sta $D3EE,y
|
|
dey
|
|
bpl :-
|
|
lda ROMIN2
|
|
rts
|
|
|
|
L26CD: stax $06
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
ldy #$00
|
|
lda ($06),y
|
|
tay
|
|
: lda ($06),y
|
|
sta $D3AD,y
|
|
dey
|
|
bpl :-
|
|
lda ROMIN2
|
|
rts
|
|
|
|
fail: lda #0
|
|
sta flag
|
|
jmp fail2
|
|
|
|
.byte 0, $D, 0, 0, 0
|
|
|
|
;; Generic buffer?
|
|
buffer: .res 300, 0
|
|
|
|
filename_buf:
|
|
.res 16, 0
|
|
|
|
file_type: ; written but not read ???
|
|
.byte 0
|
|
|
|
L2832: .res 31, 0 ; unused ???
|
|
|
|
;;; ============================================================
|
|
|
|
.proc append_filename_to_buffer
|
|
lda filename_buf
|
|
bne :+
|
|
rts
|
|
|
|
: ldx #0
|
|
ldy buffer
|
|
lda #'/'
|
|
sta buffer+1,y
|
|
iny
|
|
loop: cpx filename_buf
|
|
bcs done
|
|
lda filename_buf+1,x
|
|
sta buffer+1,y
|
|
inx
|
|
iny
|
|
jmp loop
|
|
|
|
done: sty buffer
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc remove_filename_from_buffer
|
|
ldx buffer
|
|
bne :+
|
|
rts
|
|
|
|
: lda buffer,x
|
|
cmp #'/'
|
|
beq done
|
|
dex
|
|
bne :-
|
|
stx buffer
|
|
rts
|
|
|
|
done: dex
|
|
stx buffer
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc append_filename_to_path0
|
|
lda filename_buf
|
|
bne :+
|
|
rts
|
|
|
|
: ldx #0
|
|
ldy path0
|
|
lda #'/'
|
|
sta path0+1,y
|
|
iny
|
|
loop: cpx filename_buf
|
|
bcs done
|
|
lda filename_buf+1,x
|
|
sta path0+1,y
|
|
inx
|
|
iny
|
|
jmp loop
|
|
|
|
done: sty path0
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc remove_filename_from_path0
|
|
ldx path0
|
|
bne :+
|
|
rts
|
|
|
|
: lda path0,x
|
|
cmp #'/'
|
|
beq done
|
|
dex
|
|
bne :-
|
|
stx path0
|
|
rts
|
|
|
|
done: dex
|
|
stx path0
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc show_copying_screen
|
|
;; Turn on 80-column mode
|
|
jsr SLOT3ENTRY
|
|
jsr HOME
|
|
|
|
;; Center string
|
|
lda #80
|
|
sec
|
|
sbc str_copying_to_ramcard
|
|
lsr a ; / 2 to center
|
|
sta CH
|
|
lda #12
|
|
sta CV
|
|
jsr VTAB
|
|
ldy #0
|
|
loop: iny
|
|
lda str_copying_to_ramcard,y
|
|
ora #$80
|
|
jsr COUT
|
|
cpy str_copying_to_ramcard
|
|
bne loop
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc fail_copy
|
|
lda #0
|
|
sta copy_flag
|
|
jmp fail
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
;;; Unreferenced ???
|
|
|
|
.proc copy_input_to_buffer
|
|
ldy #$00
|
|
loop: lda $0200,y
|
|
cmp #$80|CHAR_RETURN
|
|
beq done
|
|
and #$7F
|
|
sta buffer+1,y
|
|
iny
|
|
jmp loop
|
|
|
|
done: sty buffer
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc copy_file
|
|
jsr append_filename_to_path0
|
|
jsr append_filename_to_buffer
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params
|
|
beq :+
|
|
cmp #ERR_FILE_NOT_FOUND
|
|
beq cleanup
|
|
jmp fail
|
|
|
|
: lda get_file_info_params::file_type
|
|
sta file_type
|
|
cmp #FT_DIRECTORY
|
|
bne :+
|
|
jsr copy_directory
|
|
jmp done
|
|
|
|
: jsr create_file_for_copy
|
|
cmp #ERR_DUPLICATE_FILENAME
|
|
bne :+
|
|
lda filenum
|
|
bne cleanup
|
|
pla
|
|
pla
|
|
jmp fail2
|
|
|
|
: jsr copy_normal_file
|
|
|
|
cleanup:
|
|
jsr remove_filename_from_buffer
|
|
jsr remove_filename_from_path0
|
|
done: rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc copy_directory_impl
|
|
ptr := $6
|
|
|
|
dir_buffer := $A400
|
|
|
|
entry_length_offset := $23
|
|
file_count_offset := $25
|
|
header_length := $2B
|
|
|
|
DEFINE_OPEN_PARAMS open_params, buffer, $A000
|
|
DEFINE_READ_PARAMS read_params, dir_buffer, $0200
|
|
DEFINE_CLOSE_PARAMS close_params
|
|
|
|
start: jsr create_file_for_copy
|
|
cmp #ERR_DUPLICATE_FILENAME
|
|
beq bail
|
|
MLI_CALL OPEN, open_params
|
|
beq :+
|
|
jsr fail_copy
|
|
bail: rts
|
|
|
|
: lda open_params::ref_num
|
|
sta read_params::ref_num
|
|
sta close_params::ref_num
|
|
MLI_CALL READ, read_params
|
|
beq :+
|
|
jsr fail_copy
|
|
rts
|
|
|
|
: lda #0
|
|
sta L2A10
|
|
lda #<(dir_buffer + header_length)
|
|
sta ptr
|
|
lda #>(dir_buffer + header_length)
|
|
sta ptr+1
|
|
L2997: lda dir_buffer + file_count_offset
|
|
cmp L2A10
|
|
bne L29B1
|
|
L299F: MLI_CALL CLOSE, close_params
|
|
beq :+
|
|
jmp fail_copy
|
|
|
|
: jsr remove_filename_from_buffer
|
|
jsr remove_filename_from_path0
|
|
rts
|
|
|
|
L29B1: ldy #0
|
|
lda (ptr),y
|
|
bne L29BA
|
|
jmp L29F6
|
|
|
|
L29BA: and #$0F
|
|
tay
|
|
L29BD: lda (ptr),y
|
|
sta filename_buf,y
|
|
dey
|
|
bne L29BD
|
|
lda (ptr),y
|
|
and #$0F
|
|
sta filename_buf,y
|
|
jsr append_filename_to_path0
|
|
jsr append_filename_to_buffer
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params
|
|
beq :+
|
|
jmp fail_copy
|
|
|
|
: lda get_file_info_params::file_type
|
|
sta file_type
|
|
jsr create_file_for_copy
|
|
cmp #ERR_DUPLICATE_FILENAME
|
|
beq :+
|
|
jsr copy_normal_file
|
|
: jsr remove_filename_from_buffer
|
|
jsr remove_filename_from_path0
|
|
inc L2A10
|
|
L29F6: add16_8 ptr, dir_buffer + entry_length_offset, ptr
|
|
lda ptr+1
|
|
cmp #>(dir_buffer + $200)
|
|
bcs L2A0D
|
|
jmp L2997
|
|
|
|
L2A0D: jmp L299F
|
|
|
|
L2A10: .byte 0
|
|
.endproc
|
|
copy_directory := copy_directory_impl::start
|
|
|
|
;;; ============================================================
|
|
|
|
.proc copy_normal_file
|
|
;; Open source
|
|
: MLI_CALL OPEN, open_srcfile_params
|
|
beq :+
|
|
jsr fail_copy
|
|
jmp :-
|
|
|
|
;; Open destination
|
|
: MLI_CALL OPEN, open_dstfile_params
|
|
beq :+
|
|
jsr fail_copy
|
|
jmp :-
|
|
|
|
: lda open_srcfile_params::ref_num
|
|
sta read_srcfile_params::ref_num
|
|
sta close_srcfile_params::ref_num
|
|
lda open_dstfile_params::ref_num
|
|
sta write_dstfile_params::ref_num
|
|
sta close_dstfile_params::ref_num
|
|
|
|
;; Read a chunk
|
|
loop: copy16 #max_copy_count, read_srcfile_params::request_count
|
|
read: MLI_CALL READ, read_srcfile_params
|
|
beq :+
|
|
cmp #ERR_END_OF_FILE
|
|
beq done
|
|
jsr fail_copy
|
|
jmp read
|
|
|
|
;; Write the chunk
|
|
: copy16 read_srcfile_params::trans_count, write_dstfile_params::request_count
|
|
ora read_srcfile_params::trans_count
|
|
beq done
|
|
write: MLI_CALL WRITE, write_dstfile_params
|
|
beq :+
|
|
jsr fail_copy
|
|
jmp write
|
|
|
|
;; More to copy?
|
|
: lda write_dstfile_params::trans_count
|
|
cmp #<max_copy_count
|
|
bne done
|
|
lda write_dstfile_params::trans_count+1
|
|
cmp #>max_copy_count
|
|
beq loop
|
|
|
|
;; Close source and destination
|
|
done: MLI_CALL CLOSE, close_srcfile_params
|
|
MLI_CALL CLOSE, close_dstfile_params
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc create_file_for_copy
|
|
;; Copy file_type, aux_type, storage_type
|
|
ldx #7
|
|
: lda get_file_info_params,x
|
|
sta create_params,x
|
|
dex
|
|
cpx #3
|
|
bne :-
|
|
MLI_CALL CREATE, create_params
|
|
beq :+
|
|
cmp #ERR_DUPLICATE_FILENAME
|
|
beq :+
|
|
jsr fail_copy
|
|
: rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc check_desktop2_on_device
|
|
lda active_device
|
|
cmp #$3E ; ???
|
|
bne :+
|
|
jmp next
|
|
|
|
;; Check slot for signature bytes
|
|
: and #$70 ; Compute $Cn00
|
|
lsr a
|
|
lsr a
|
|
lsr a
|
|
lsr a
|
|
ora #$C0
|
|
sta $08+1
|
|
lda #0
|
|
sta $08
|
|
ldx #0 ; Compare signature bytes
|
|
bloop: lda sig_offsets,x
|
|
tay
|
|
lda ($08),y
|
|
cmp sig_bytes,x
|
|
bne error
|
|
inx
|
|
cpx #4 ; Number of signature bytes
|
|
bcc bloop
|
|
ldy #$FB ; Also check $CnFB
|
|
lda ($08),y
|
|
and #$01
|
|
bne next
|
|
error: sec
|
|
rts
|
|
|
|
next: MLI_CALL GET_PREFIX, get_prefix_params2
|
|
bne error
|
|
|
|
;; Append "DeskTop2" to path at $D00
|
|
ldx $0D00
|
|
ldy #0
|
|
loop: inx
|
|
iny
|
|
lda str_desktop2,y
|
|
sta $0D00,x
|
|
cpy str_desktop2
|
|
bne loop
|
|
stx $0D00
|
|
|
|
;; ... and get info
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params4
|
|
beq error
|
|
clc ; ok
|
|
rts
|
|
|
|
str_desktop2:
|
|
PASCAL_STRING "DeskTop2"
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc write_desktop1_impl
|
|
DEFINE_OPEN_PARAMS open_params, str_desktop1_path, $1000
|
|
str_desktop1_path:
|
|
PASCAL_STRING "DeskTop/DESKTOP1"
|
|
DEFINE_WRITE_PARAMS write_params, $2000, $45
|
|
DEFINE_CLOSE_PARAMS close_params
|
|
|
|
start: MLI_CALL OPEN, open_params
|
|
bne :+
|
|
lda open_params::ref_num
|
|
sta write_params::ref_num
|
|
sta close_params::ref_num
|
|
MLI_CALL WRITE, write_params
|
|
bne :+
|
|
MLI_CALL CLOSE, close_params
|
|
: rts
|
|
.endproc
|
|
write_desktop1 := write_desktop1_impl::start
|
|
|
|
;;; ============================================================
|
|
|
|
L2B57: addr_call L26CD, L2005
|
|
rts
|
|
|
|
.byte 0
|
|
|
|
path0: .res 65, 0
|
|
|
|
;;; ============================================================
|
|
;;; Launch FILER - used if machine is not 128k
|
|
;;; Relocated to $300 before invoking
|
|
|
|
saved_org := *
|
|
.proc launch_filer
|
|
.org $300
|
|
|
|
sys_start := $2000
|
|
|
|
MLI_CALL OPEN, open_params
|
|
beq :+
|
|
jmp rts1
|
|
|
|
: lda open_params_ref_num
|
|
sta read_params_ref_num
|
|
MLI_CALL READ, read_params
|
|
beq :+
|
|
jmp rts1
|
|
|
|
: MLI_CALL CLOSE, close_params
|
|
beq :+
|
|
jmp rts1
|
|
|
|
: jmp sys_start
|
|
|
|
DEFINE_OPEN_PARAMS open_params, filename, $800
|
|
open_params_ref_num := open_params::ref_num
|
|
|
|
DEFINE_READ_PARAMS read_params, sys_start, MLI - sys_start
|
|
read_params_ref_num := read_params::ref_num
|
|
|
|
DEFINE_CLOSE_PARAMS close_params
|
|
|
|
filename:
|
|
PASCAL_STRING "FILER"
|
|
.endproc
|
|
.assert .sizeof(launch_filer) <= $D0, error, "Routine length exceeded"
|
|
|
|
;;; ============================================================
|
|
|
|
.org (saved_org + .sizeof(launch_filer))
|
|
|
|
filenum:
|
|
.byte 0 ; index of file being copied
|
|
|
|
flag: .byte 0 ; written but not read ???
|
|
|
|
slot: .byte 0
|
|
|
|
DEFINE_WRITE_BLOCK_PARAMS write_block_params, prodos_loader_blocks, 0
|
|
write_block_params_unit_num := write_block_params::unit_num
|
|
DEFINE_WRITE_BLOCK_PARAMS write_block_params2, prodos_loader_blocks + 512, 1
|
|
write_block_params2_unit_num := write_block_params2::unit_num
|
|
|
|
PAD_TO $2C00
|
|
|
|
;;; ============================================================
|
|
|
|
prodos_loader_blocks:
|
|
.assert * = $2C00, error, "Segment length mismatch"
|
|
.incbin "inc/pdload.dat"
|
|
|
|
.endproc ; bootstrap
|
|
|
|
;;; ============================================================
|
|
|
|
.assert * = $3000, error, "Segment length mismatch"
|
|
|
|
;;; SPECULATION: This copies Selector entries marked
|
|
;;; "Down load" / "At boot" to the RAMCard as well
|
|
|
|
.proc part2
|
|
jsr SLOT3ENTRY
|
|
jsr HOME
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
lda $D3FF
|
|
pha
|
|
lda ROMIN2
|
|
pla
|
|
bne L3019
|
|
jmp invoke_selector_or_desktop
|
|
|
|
L3019: lda LCBANK2
|
|
lda LCBANK2
|
|
ldx #$17
|
|
lda #$00
|
|
L3023: sta $D395,x
|
|
dex
|
|
bpl L3023
|
|
lda ROMIN2
|
|
jsr read_selector_list
|
|
beq :+
|
|
jmp L30B8
|
|
|
|
: lda #0
|
|
sta L30BB
|
|
L3039: lda L30BB
|
|
cmp $4400
|
|
beq L3071
|
|
jsr L37C5
|
|
stax $06
|
|
ldy #$0F
|
|
lda ($06),y
|
|
bne L306B
|
|
lda L30BB
|
|
jsr L37D2
|
|
jsr L38B2
|
|
jsr L3489
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
ldx L30BB
|
|
lda #$FF
|
|
sta $D395,x
|
|
lda ROMIN2
|
|
L306B: inc L30BB
|
|
jmp L3039
|
|
|
|
L3071: lda #$00
|
|
sta L30BB
|
|
L3076: lda L30BB
|
|
cmp $4401
|
|
beq L30B8
|
|
clc
|
|
adc #$08
|
|
jsr L37C5
|
|
stax $06
|
|
ldy #$0F
|
|
lda ($06),y
|
|
bne L30B2
|
|
lda L30BB
|
|
clc
|
|
adc #$08
|
|
jsr L37D2
|
|
jsr L38B2
|
|
jsr L3489
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
lda L30BB
|
|
clc
|
|
adc #$08
|
|
tax
|
|
lda #$FF
|
|
sta $D395,x
|
|
lda ROMIN2
|
|
L30B2: inc L30BB
|
|
jmp L3076
|
|
|
|
L30B8: jmp invoke_selector_or_desktop
|
|
|
|
L30BB: .byte $00
|
|
DEFINE_OPEN_PARAMS open_params6, path2, $0800
|
|
DEFINE_READ_PARAMS read_params4, L30CA, 4
|
|
L30CA: .res 4, 0
|
|
DEFINE_CLOSE_PARAMS close_params5
|
|
DEFINE_READ_PARAMS read_params5, L3150, $27
|
|
DEFINE_READ_PARAMS read_params6, L30E0, 5
|
|
L30E0: .res 5, 0
|
|
.byte $00,$00,$00,$00
|
|
DEFINE_CLOSE_PARAMS close_params7
|
|
DEFINE_CLOSE_PARAMS close_params6
|
|
.byte $01
|
|
.addr path2
|
|
DEFINE_OPEN_PARAMS open_params7, path2, $0D00
|
|
DEFINE_OPEN_PARAMS open_params8, path1, $1C00
|
|
DEFINE_READ_PARAMS read_params7, $1100, $0B00
|
|
DEFINE_WRITE_PARAMS write_params3, $1100, $0B00
|
|
|
|
DEFINE_CREATE_PARAMS create_params3, path1, ACCESS_DEFAULT
|
|
|
|
DEFINE_CREATE_PARAMS create_params2, path1, 0
|
|
|
|
L3124: .byte $00,$00
|
|
|
|
DEFINE_GET_FILE_INFO_PARAMS get_file_info_params2, path2
|
|
.byte $00
|
|
|
|
DEFINE_GET_FILE_INFO_PARAMS get_file_info_params3, path1
|
|
.byte $00,$02,$00,$00,$00
|
|
|
|
L3150: .byte $00
|
|
L3151: .byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00
|
|
L3160: .byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $40,$35,$3D,$35,$86,$31,$60,$00
|
|
|
|
path1: .res 65, 0
|
|
path2: .res 65, 0
|
|
|
|
L320A: .res 64, 0
|
|
L324A: .res 64, 0
|
|
L328A: .byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
|
L329A: .byte $00
|
|
L329B: .byte $0D
|
|
L329C: .byte $00
|
|
L329D: .byte $00
|
|
L329E: .byte $00
|
|
L329F: .res 170, 0
|
|
L3349: .byte $00
|
|
L334A: .byte $00
|
|
L334B: ldx L3349
|
|
lda L329E
|
|
sta L329F,x
|
|
inx
|
|
stx L3349
|
|
rts
|
|
|
|
L3359: ldx L3349
|
|
dex
|
|
lda L329F,x
|
|
sta L329E
|
|
stx L3349
|
|
rts
|
|
|
|
L3367: lda #$00
|
|
sta L329C
|
|
sta L334A
|
|
MLI_CALL OPEN, open_params6
|
|
beq L337A
|
|
jmp handle_error_code
|
|
|
|
L337A: lda open_params6::ref_num
|
|
sta L329D
|
|
sta read_params4::ref_num
|
|
MLI_CALL READ, read_params4
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: jsr L33A4
|
|
rts
|
|
|
|
L3392: lda L329D
|
|
sta close_params5::ref_num
|
|
MLI_CALL CLOSE, close_params5
|
|
beq L33A3
|
|
jmp handle_error_code
|
|
|
|
L33A3: rts
|
|
|
|
L33A4: inc L329C
|
|
lda L329D
|
|
sta read_params5::ref_num
|
|
MLI_CALL READ, read_params5
|
|
beq L33B8
|
|
jmp handle_error_code
|
|
|
|
L33B8: inc L334A
|
|
lda L334A
|
|
cmp L329B
|
|
bcc L33E0
|
|
lda #$00
|
|
sta L334A
|
|
lda L329D
|
|
sta read_params6::ref_num
|
|
MLI_CALL READ, read_params6
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: lda read_params6::trans_count
|
|
cmp read_params6::request_count
|
|
rts
|
|
|
|
L33E0: return #$00
|
|
|
|
L33E3: lda L329C
|
|
sta L329E
|
|
jsr L3392
|
|
jsr L334B
|
|
jsr L36FB
|
|
jsr L3367
|
|
rts
|
|
|
|
L33F6: jsr L3392
|
|
jsr L346E
|
|
jsr L3720
|
|
jsr L3359
|
|
jsr L3367
|
|
jsr L340C
|
|
jsr L346B
|
|
rts
|
|
|
|
L340C: lda L329C
|
|
cmp L329E
|
|
beq L341A
|
|
jsr L33A4
|
|
jmp L340C
|
|
|
|
L341A: rts
|
|
|
|
L341B: lda #$00
|
|
sta L329A
|
|
jsr L3367
|
|
L3423: jsr L33A4
|
|
bne L3455
|
|
lda L3150
|
|
beq L3423
|
|
lda L3150
|
|
sta L346F
|
|
and #$0F
|
|
sta L3150
|
|
lda #$00
|
|
sta L3467
|
|
jsr L3468
|
|
lda L3467
|
|
bne L3423
|
|
lda L3160
|
|
cmp #$0F
|
|
bne L3423
|
|
jsr L33E3
|
|
inc L329A
|
|
jmp L3423
|
|
|
|
L3455: lda L329A
|
|
beq L3463
|
|
jsr L33F6
|
|
dec L329A
|
|
jmp L3423
|
|
|
|
L3463: jsr L3392
|
|
rts
|
|
|
|
L3467: .byte 0
|
|
L3468: jmp L3540
|
|
|
|
L346B: jmp L353D
|
|
|
|
L346E: rts
|
|
|
|
L346F: .byte 0
|
|
ldy #$00
|
|
L3472: lda $0200,y
|
|
cmp #$8D
|
|
beq L3482
|
|
and #$7F
|
|
sta path2+1,y
|
|
iny
|
|
jmp L3472
|
|
|
|
L3482: sty path2
|
|
rts
|
|
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0
|
|
L3489: lda #$FF
|
|
sta L353B
|
|
jsr L3777
|
|
ldx path1
|
|
lda #'/'
|
|
sta path1+1,x
|
|
inc path1
|
|
ldy #$00
|
|
ldx path1
|
|
L34A1: iny
|
|
inx
|
|
lda L328A,y
|
|
sta path1,x
|
|
cpy L328A
|
|
bne L34A1
|
|
stx path1
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params3
|
|
cmp #ERR_FILE_NOT_FOUND
|
|
beq L34C4
|
|
cmp #ERR_VOL_NOT_FOUND
|
|
beq L34C4
|
|
cmp #ERR_PATH_NOT_FOUND
|
|
beq L34C4
|
|
rts
|
|
|
|
L34C4: MLI_CALL GET_FILE_INFO, get_file_info_params2
|
|
beq L34DD
|
|
cmp #ERR_VOL_NOT_FOUND
|
|
beq L34D4
|
|
cmp #ERR_FILE_NOT_FOUND
|
|
bne L34DA
|
|
L34D4: jsr show_insert_prompt
|
|
jmp L34C4
|
|
|
|
L34DA: jmp handle_error_code
|
|
|
|
L34DD: lda get_file_info_params2::storage_type
|
|
cmp #ST_VOLUME_DIRECTORY
|
|
beq L34EC
|
|
cmp #ST_LINKED_DIRECTORY
|
|
beq L34EC
|
|
lda #$00
|
|
beq L34EE
|
|
L34EC: lda #$FF
|
|
L34EE: sta L353A
|
|
|
|
;; copy file_type, aux_type, storage_type
|
|
ldy #7
|
|
: lda get_file_info_params2,y
|
|
sta create_params2,y
|
|
dey
|
|
cpy #3
|
|
bne :-
|
|
lda #ACCESS_DEFAULT
|
|
sta create_params2::access
|
|
jsr L35A9
|
|
bcc L350B
|
|
jmp show_no_space_prompt
|
|
|
|
L350B: ldx #$03
|
|
L350D: lda get_file_info_params2::create_date,x
|
|
sta create_params2::create_date,x
|
|
dex
|
|
bpl L350D
|
|
lda create_params2::storage_type
|
|
cmp #ST_VOLUME_DIRECTORY
|
|
bne L3522
|
|
lda #ST_LINKED_DIRECTORY
|
|
sta create_params2::storage_type
|
|
L3522: MLI_CALL CREATE, create_params2
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: lda L353A
|
|
beq L3537
|
|
jmp L341B
|
|
|
|
.byte 0
|
|
rts
|
|
|
|
L3537: jmp L3643
|
|
|
|
L353A: .byte 0
|
|
L353B: .byte 0
|
|
L353C: .byte 0
|
|
L353D: jmp L375E
|
|
|
|
L3540: lda L3160
|
|
cmp #$0F
|
|
bne L3574
|
|
jsr L36FB
|
|
jsr show_copying_screen
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params2
|
|
beq L3566
|
|
jmp handle_error_code
|
|
L3558: jsr L375E
|
|
jsr L3720
|
|
lda #$FF
|
|
sta L3467
|
|
jmp L35A4
|
|
|
|
L3566: jsr L3739
|
|
jsr L36C1
|
|
bcs L3558
|
|
jsr L3720
|
|
jmp L35A4
|
|
|
|
L3574: jsr L3739
|
|
jsr L36FB
|
|
jsr show_copying_screen
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params2
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: jsr L35A9
|
|
bcc L3590
|
|
jmp show_no_space_prompt
|
|
|
|
L3590: jsr L3720
|
|
jsr L36C1
|
|
bcs L35A5
|
|
jsr L36FB
|
|
jsr L3643
|
|
jsr L3720
|
|
jsr L375E
|
|
L35A4: rts
|
|
|
|
L35A5: jsr L375E
|
|
rts
|
|
|
|
L35A9: MLI_CALL GET_FILE_INFO, get_file_info_params2
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: lda #$00
|
|
sta L3641
|
|
sta L3642
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params3
|
|
beq :+
|
|
cmp #ERR_FILE_NOT_FOUND
|
|
beq L35D7
|
|
jmp handle_error_code
|
|
|
|
: copy16 get_file_info_params3::blocks_used, L3641
|
|
L35D7: lda path1
|
|
sta L363F
|
|
ldy #$01
|
|
L35DF: iny
|
|
cpy path1
|
|
bcs L3635
|
|
lda path1,y
|
|
cmp #'/'
|
|
bne L35DF
|
|
tya
|
|
sta path1
|
|
sta L3640
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params3
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: sub16 get_file_info_params3::aux_type, get_file_info_params3::blocks_used, L363D
|
|
sub16 L363D, L3641, L363D
|
|
cmp16 L363D, get_file_info_params2::blocks_used
|
|
bcs L3635
|
|
sec
|
|
bcs L3636
|
|
L3635: clc
|
|
L3636: lda L363F
|
|
sta path1
|
|
rts
|
|
|
|
L363D: .byte 0,0
|
|
L363F: .byte 0
|
|
L3640: .byte 0
|
|
L3641: .byte 0
|
|
L3642: .byte 0
|
|
L3643: MLI_CALL OPEN, open_params7
|
|
beq L364E
|
|
jsr handle_error_code
|
|
L364E: MLI_CALL OPEN, open_params8
|
|
beq L3659
|
|
jmp handle_error_code
|
|
|
|
L3659: lda open_params7::ref_num
|
|
sta read_params7::ref_num
|
|
sta close_params7::ref_num
|
|
lda open_params8::ref_num
|
|
sta write_params3::ref_num
|
|
sta close_params6::ref_num
|
|
|
|
L366B: copy16 #$0B00, read_params7::request_count
|
|
MLI_CALL READ, read_params7
|
|
beq :+
|
|
cmp #ERR_END_OF_FILE
|
|
beq L36AE
|
|
jmp handle_error_code
|
|
|
|
: copy16 read_params7::trans_count, write_params3::request_count
|
|
ora read_params7::trans_count
|
|
beq L36AE
|
|
MLI_CALL WRITE, write_params3
|
|
beq :+
|
|
jmp handle_error_code
|
|
|
|
: lda write_params3::trans_count
|
|
cmp #<$0B00
|
|
bne L36AE
|
|
lda write_params3::trans_count+1
|
|
cmp #>$0B00
|
|
beq L366B
|
|
L36AE: MLI_CALL CLOSE, close_params6
|
|
MLI_CALL CLOSE, close_params7
|
|
jsr get_file_info_and_copy
|
|
jsr do_set_file_info
|
|
rts
|
|
|
|
;; copy file_type, aux_type, storage_type
|
|
L36C1: ldx #7
|
|
: lda get_file_info_params2,x
|
|
sta create_params3,x
|
|
dex
|
|
cpx #3
|
|
bne :-
|
|
lda #ACCESS_DEFAULT
|
|
sta create_params3::access
|
|
ldx #$03
|
|
L36D5: lda get_file_info_params2::create_date,x
|
|
sta create_params3::create_date,x
|
|
dex
|
|
bpl L36D5
|
|
lda create_params3::storage_type
|
|
cmp #ST_VOLUME_DIRECTORY
|
|
bne L36EA
|
|
lda #ST_LINKED_DIRECTORY
|
|
sta create_params3::storage_type
|
|
L36EA: MLI_CALL CREATE, create_params3
|
|
clc
|
|
beq L36F6
|
|
jmp handle_error_code
|
|
|
|
L36F6: rts
|
|
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0
|
|
|
|
L36FB: lda L3150
|
|
bne L3701
|
|
rts
|
|
|
|
L3701: ldx #$00
|
|
ldy path2
|
|
lda #'/'
|
|
sta path2+1,y
|
|
iny
|
|
L370C: cpx L3150
|
|
bcs L371C
|
|
lda L3151,x
|
|
sta path2+1,y
|
|
inx
|
|
iny
|
|
jmp L370C
|
|
|
|
L371C: sty path2
|
|
rts
|
|
|
|
L3720: ldx path2
|
|
bne L3726
|
|
rts
|
|
|
|
L3726: lda path2,x
|
|
cmp #'/'
|
|
beq L3734
|
|
dex
|
|
bne L3726
|
|
stx path2
|
|
rts
|
|
|
|
L3734: dex
|
|
stx path2
|
|
rts
|
|
|
|
L3739: lda L3150
|
|
bne L373F
|
|
rts
|
|
|
|
L373F: ldx #$00
|
|
ldy path1
|
|
lda #'/'
|
|
sta path1+1,y
|
|
iny
|
|
L374A: cpx L3150
|
|
bcs L375A
|
|
lda L3151,x
|
|
sta path1+1,y
|
|
inx
|
|
iny
|
|
jmp L374A
|
|
|
|
L375A: sty path1
|
|
rts
|
|
|
|
L375E: ldx path1
|
|
bne L3764
|
|
rts
|
|
|
|
L3764: lda path1,x
|
|
cmp #'/'
|
|
beq L3772
|
|
dex
|
|
bne L3764
|
|
stx path1
|
|
rts
|
|
|
|
L3772: dex
|
|
stx path1
|
|
rts
|
|
|
|
L3777: ldy #0
|
|
sta L353C
|
|
dey
|
|
L377D: iny
|
|
lda L324A,y
|
|
cmp #'/'
|
|
bne L3788
|
|
sty L353C
|
|
L3788: sta path2,y
|
|
cpy L324A
|
|
bne L377D
|
|
ldy L320A
|
|
L3793: lda L320A,y
|
|
sta path1,y
|
|
dey
|
|
bpl L3793
|
|
rts
|
|
|
|
.proc do_set_file_info
|
|
lda #7 ; SET_FILE_INFO param_count
|
|
sta get_file_info_params3
|
|
MLI_CALL SET_FILE_INFO, get_file_info_params3
|
|
lda #10 ; GET_FILE_INFO param_count
|
|
sta get_file_info_params3
|
|
rts
|
|
.endproc
|
|
|
|
.proc get_file_info_and_copy
|
|
MLI_CALL GET_FILE_INFO, get_file_info_params2
|
|
bne fail
|
|
ldx #$0A
|
|
: lda get_file_info_params2::access,x
|
|
sta get_file_info_params3::access,x
|
|
dex
|
|
bpl :-
|
|
rts
|
|
|
|
fail: pla
|
|
pla
|
|
rts
|
|
.endproc
|
|
|
|
L37C5: jsr L381C
|
|
clc
|
|
adc #<$4402
|
|
tay
|
|
txa
|
|
adc #>$4402
|
|
tax
|
|
tya
|
|
rts
|
|
|
|
L37D2: jsr L3836
|
|
clc
|
|
adc #<$4582
|
|
tay
|
|
txa
|
|
adc #>$4582
|
|
tax
|
|
tya
|
|
rts
|
|
|
|
.byte $00,$00
|
|
|
|
;;; ============================================================
|
|
|
|
.proc read_selector_list_impl
|
|
DEFINE_OPEN_PARAMS open_params, str_selector_list, $4000
|
|
str_selector_list:
|
|
PASCAL_STRING "Selector.List"
|
|
DEFINE_READ_PARAMS read_params, $4400, $0800
|
|
DEFINE_CLOSE_PARAMS close_params
|
|
|
|
start: MLI_CALL OPEN, open_params
|
|
bne :+
|
|
lda open_params::ref_num
|
|
sta read_params::ref_num
|
|
MLI_CALL READ, read_params
|
|
MLI_CALL CLOSE, close_params
|
|
lda #0
|
|
: rts
|
|
.endproc
|
|
read_selector_list := read_selector_list_impl::start
|
|
|
|
;;; ============================================================
|
|
|
|
L381C: ldx #$00
|
|
stx L3835
|
|
asl a
|
|
rol L3835
|
|
asl a
|
|
rol L3835
|
|
asl a
|
|
rol L3835
|
|
asl a
|
|
rol L3835
|
|
ldx L3835
|
|
rts
|
|
|
|
L3835: .byte 0
|
|
L3836: ldx #$00
|
|
stx L3857
|
|
asl a
|
|
rol L3857
|
|
asl a
|
|
rol L3857
|
|
asl a
|
|
rol L3857
|
|
asl a
|
|
rol L3857
|
|
asl a
|
|
rol L3857
|
|
asl a
|
|
rol L3857
|
|
ldx L3857
|
|
rts
|
|
|
|
L3857: .byte $00
|
|
|
|
;;; ============================================================
|
|
|
|
.proc invoke_selector_or_desktop_impl
|
|
sys_start := $2000
|
|
|
|
DEFINE_OPEN_PARAMS open_desktop2_params, str_desktop2, $5000
|
|
DEFINE_OPEN_PARAMS open_selector_params, str_selector, $5400
|
|
DEFINE_READ_PARAMS read_params, sys_start, $0400
|
|
DEFINE_CLOSE_PARAMS close_everything_params
|
|
|
|
str_selector:
|
|
PASCAL_STRING "Selector"
|
|
str_desktop2:
|
|
PASCAL_STRING "DeskTop2"
|
|
|
|
|
|
start: MLI_CALL CLOSE, close_everything_params
|
|
MLI_CALL OPEN, open_selector_params
|
|
beq selector
|
|
MLI_CALL OPEN, open_desktop2_params
|
|
beq desktop2
|
|
|
|
brk ; just crash
|
|
|
|
desktop2:
|
|
lda open_desktop2_params::ref_num
|
|
jmp read
|
|
|
|
selector:
|
|
lda open_selector_params::ref_num
|
|
|
|
|
|
read: sta read_params::ref_num
|
|
MLI_CALL READ, read_params
|
|
MLI_CALL CLOSE, close_everything_params
|
|
jmp sys_start
|
|
.endproc
|
|
invoke_selector_or_desktop := invoke_selector_or_desktop_impl::start
|
|
|
|
;;; ============================================================
|
|
|
|
L38B2: stax $06
|
|
ldy #$00
|
|
lda ($06),y
|
|
tay
|
|
L38BB: lda ($06),y
|
|
sta L324A,y
|
|
dey
|
|
bpl L38BB
|
|
ldy L324A
|
|
L38C6: lda L324A,y
|
|
and #$7F
|
|
cmp #'/'
|
|
beq L38D2
|
|
dey
|
|
bne L38C6
|
|
L38D2: dey
|
|
sty L324A
|
|
L38D6: lda L324A,y
|
|
and #$7F
|
|
cmp #'/'
|
|
beq L38E2
|
|
dey
|
|
bpl L38D6
|
|
L38E2: ldx #$00
|
|
L38E4: iny
|
|
inx
|
|
lda L324A,y
|
|
sta L328A,x
|
|
cpy L324A
|
|
bne L38E4
|
|
stx L328A
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
ldy $D3EE
|
|
L38FD: lda $D3EE,y
|
|
sta L320A,y
|
|
dey
|
|
bpl L38FD
|
|
lda ROMIN2
|
|
rts
|
|
|
|
str_copying:
|
|
PASCAL_STRING "Copying:"
|
|
|
|
str_insert:
|
|
PASCAL_STRING "Insert the source disk and press <Return> to continue or <ESC> to cancel"
|
|
|
|
str_not_enough:
|
|
PASCAL_STRING "Not enough room in the RAMCard, press <Return> to continue"
|
|
|
|
str_error:
|
|
PASCAL_STRING "Error $"
|
|
|
|
str_occured:
|
|
PASCAL_STRING " occured when copying "
|
|
|
|
str_not_completed:
|
|
PASCAL_STRING "The copy was not completed, press <Return> to continue."
|
|
|
|
;;; ============================================================
|
|
|
|
.proc show_copying_screen
|
|
jsr HOME
|
|
lda #0
|
|
jsr VTABZ
|
|
lda #0
|
|
jsr set_htab
|
|
addr_call cout_string, str_copying
|
|
addr_call cout_string_newline, path2
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc show_insert_prompt
|
|
lda #0
|
|
jsr VTABZ
|
|
lda #0
|
|
jsr set_htab
|
|
addr_call cout_string, str_insert
|
|
jsr wait_enter_escape
|
|
cmp #CHAR_ESCAPE
|
|
bne :+
|
|
jmp finish_and_invoke
|
|
|
|
: jsr HOME
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc show_no_space_prompt
|
|
lda #0
|
|
jsr VTABZ
|
|
lda #0
|
|
jsr set_htab
|
|
addr_call cout_string, str_not_enough
|
|
jsr wait_enter_escape
|
|
jsr HOME
|
|
jmp invoke_selector_or_desktop
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc handle_error_code
|
|
cmp #ERR_OVERRUN_ERROR
|
|
bne :+
|
|
jsr show_no_space_prompt
|
|
jmp finish_and_invoke
|
|
|
|
: cmp #ERR_VOLUME_DIR_FULL
|
|
bne show_error
|
|
jsr show_no_space_prompt
|
|
jmp finish_and_invoke
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc show_error
|
|
;; Show error
|
|
pha
|
|
addr_call cout_string, str_error
|
|
pla
|
|
jsr PRBYTE
|
|
addr_call cout_string, str_occured
|
|
addr_call cout_string_newline, path2
|
|
addr_call cout_string, str_not_completed
|
|
|
|
;; Wait for keyboard
|
|
sta KBDSTRB
|
|
loop: lda KBD
|
|
bpl loop
|
|
and #$7F
|
|
sta KBDSTRB
|
|
cmp #'M'
|
|
beq L3A97
|
|
cmp #'m'
|
|
beq L3A97
|
|
cmp #CHAR_RETURN
|
|
bne loop
|
|
jsr HOME
|
|
jmp invoke_selector_or_desktop
|
|
.endproc
|
|
|
|
L3A97: jmp MONZ
|
|
|
|
;;; ============================================================
|
|
|
|
.proc cout_string_newline
|
|
jsr cout_string
|
|
lda #$80|CHAR_RETURN
|
|
jmp COUT
|
|
;; fall through
|
|
.endproc
|
|
|
|
.proc cout_string
|
|
ptr := $6
|
|
|
|
stax ptr
|
|
ldy #0
|
|
lda (ptr),y
|
|
sta len
|
|
beq done
|
|
loop: iny
|
|
lda ($06),y
|
|
ora #$80
|
|
jsr COUT
|
|
len := *+1
|
|
cpy #0 ; self-modified
|
|
bne loop
|
|
done: rts
|
|
.endproc
|
|
|
|
.proc set_htab
|
|
sta CH
|
|
rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc wait_enter_escape
|
|
lda KBD
|
|
bpl wait_enter_escape
|
|
sta KBDSTRB
|
|
and #$7F
|
|
cmp #CHAR_ESCAPE
|
|
beq done
|
|
cmp #CHAR_RETURN
|
|
bne wait_enter_escape
|
|
done: rts
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
.proc finish_and_invoke
|
|
jsr HOME
|
|
jmp invoke_selector_or_desktop
|
|
.endproc
|
|
|
|
;;; ============================================================
|
|
|
|
L3AD8: .byte 0 ; ???
|
|
.byte $02
|
|
|
|
L3ADA: iny
|
|
inx
|
|
dec $0200
|
|
bne finish_and_invoke
|
|
lda #$A2
|
|
sta $0200
|
|
rts
|
|
.endproc ; part2
|
|
|
|
;;; ============================================================
|
|
;;; ??? Is this relocated? Part of ProDOS? RAMCard driver?
|
|
.proc WTF
|
|
|
|
;; Branch targets before/after this block
|
|
L3AB7 := $3AB7
|
|
L400C := $400C
|
|
L402B := $402B
|
|
L402C := $402C
|
|
|
|
;; Routines and data outside this block
|
|
L9F8C := $9F8C
|
|
L9FAB := $9FAB
|
|
L9FB0 := $9FB0
|
|
LA1F5 := $A1F5
|
|
LA24C := $A24C
|
|
LA62F := $A62F
|
|
LA66C := $A66C
|
|
LAB37 := $AB37
|
|
LAD46 := $AD46
|
|
LB1A0 := $B1A0
|
|
LB245 := $B245
|
|
LB2FB := $B2FB
|
|
LB3EB := $B3EB
|
|
LB41F := $B41F
|
|
LB462 := $B462
|
|
LB4A5 := $B4A5
|
|
LB522 := $B522
|
|
LB666 := $B666
|
|
LB7D0 := $B7D0
|
|
LBE50 := $BE50
|
|
LBE70 := $BE70
|
|
|
|
|
|
copy16 #$BCBD, $BEC8
|
|
lda DEVNUM
|
|
sta $BEC7
|
|
lda #$C5
|
|
jsr LBE70
|
|
bcs L3AB7
|
|
lda $BCBD
|
|
and #$0F
|
|
tax
|
|
inx
|
|
stx $BCBC
|
|
lda #$AF
|
|
sta $BCBD
|
|
jsr LB7D0
|
|
bcs L3AB7
|
|
jsr LA66C
|
|
ldx #$36
|
|
jsr L9FB0
|
|
jsr LAB37
|
|
lda $BEB9
|
|
ldx $BEBA
|
|
ldy #$3D
|
|
jsr LA62F
|
|
lda $BEBC
|
|
ldx $BEBD
|
|
ldy #$26
|
|
jsr LA62F
|
|
lda $BEB9
|
|
sec
|
|
sbc $BEBC
|
|
pha
|
|
lda $BEBA
|
|
sbc $BEBD
|
|
tax
|
|
pla
|
|
ldy #$10
|
|
jsr LA62F
|
|
clc
|
|
rts
|
|
|
|
ldax #$0F01
|
|
ldy $BEBB
|
|
cpy #$0F
|
|
bne L3B58
|
|
stx $BEB8
|
|
L3B58: jsr LB1A0
|
|
bcs L3B93
|
|
copy16 #$0259, $BED7
|
|
copy16 #$002B, $BED9
|
|
lda #$CA
|
|
jsr LBE70
|
|
bcs L3B93
|
|
ldx #$03
|
|
L3B7A: lda $027C,x
|
|
sta $BCB7,x
|
|
dex
|
|
bpl L3B7A
|
|
sta $BED9
|
|
lda #$01
|
|
sta $BCBB
|
|
lda #$00
|
|
sta $BEC9
|
|
sta $BECA
|
|
L3B93: rts
|
|
|
|
pha
|
|
lda $BE56
|
|
and #$04
|
|
beq L3B9F
|
|
ldx $BE6A
|
|
L3B9F: pla
|
|
cpx $BEB8
|
|
bne L3BC9
|
|
and $BEB7
|
|
beq L3BCD
|
|
lda $BC88
|
|
sta $BECF
|
|
lda #$0F
|
|
sta LEVEL
|
|
lda #$C8
|
|
jsr LBE70
|
|
bcs L3BC8
|
|
lda $BED0
|
|
sta $BED6
|
|
sta $BEDE
|
|
sta $BEC7
|
|
L3BC8: rts
|
|
|
|
L3BC9: lda #$0D
|
|
sec
|
|
rts
|
|
|
|
L3BCD: lda #$0A
|
|
sec
|
|
rts
|
|
|
|
L3BD1: lda $BEC9
|
|
and #$FE
|
|
sta $BEC9
|
|
ldy $BCBB
|
|
lda #$00
|
|
cpy $BCB8
|
|
bcc L3BED
|
|
tay
|
|
sty $BCBB
|
|
inc $BEC9
|
|
L3BEA: inc $BEC9
|
|
L3BED: dey
|
|
clc
|
|
bmi L3BF8
|
|
adc $BCB7
|
|
bcc L3BED
|
|
bcs L3BEA
|
|
L3BF8: adc #$04
|
|
sta $BEC8
|
|
lda #$CE
|
|
jsr LBE70
|
|
bcs L3C1D
|
|
lda #$CA
|
|
jsr LBE70
|
|
bcs L3C1D
|
|
inc $BCBB
|
|
lda $0259
|
|
and #$F0
|
|
beq L3BD1
|
|
dec $BCB9
|
|
bne L3C1D
|
|
dec $BCBA
|
|
L3C1D: rts
|
|
|
|
jmp (LBE50)
|
|
|
|
jsr LB41F
|
|
bcs L3C50
|
|
bit $BE4E
|
|
bpl L3C4C
|
|
sta $BEC7
|
|
lda #$00
|
|
sta $BEC8
|
|
sta $BEC9
|
|
sta $BECA
|
|
lda #$CE
|
|
jsr LBE70
|
|
bcs L3C45
|
|
lda $BEC7
|
|
bne L3CC3
|
|
L3C45: pha
|
|
jsr LB2FB
|
|
pla
|
|
sec
|
|
rts
|
|
|
|
L3C4C: lda #$14
|
|
sec
|
|
rts
|
|
|
|
L3C50: bit $BE43
|
|
bpl L3C5A
|
|
jsr LB2FB
|
|
bcs L3C63
|
|
L3C5A: lda $BEB8
|
|
cmp #$04
|
|
beq L3C65
|
|
lda #$0D
|
|
L3C63: sec
|
|
rts
|
|
|
|
L3C65: jsr LA1F5
|
|
bcs L3C63
|
|
lda #$00
|
|
sta $BEC8
|
|
lda $BC88
|
|
sta $BEC9
|
|
ldx $BE4D
|
|
beq L3C9E
|
|
tay
|
|
txa
|
|
asl a
|
|
asl a
|
|
adc $BC88
|
|
pha
|
|
L3C82: cmp $BC93,x
|
|
beq L3C8B
|
|
dex
|
|
bne L3C82
|
|
.byte 0
|
|
L3C8B: tya
|
|
sta $BC93,x
|
|
lda $BC9B,x
|
|
sta $BEC7
|
|
lda #$D2
|
|
jsr LBE70
|
|
bcc L3C9D
|
|
.byte 0
|
|
L3C9D: pla
|
|
L3C9E: sta $BC88
|
|
sta $BECF
|
|
lda #$00
|
|
sta LEVEL
|
|
lda #$C8
|
|
jsr LBE70
|
|
bcc L3CB7
|
|
pha
|
|
jsr LA24C
|
|
pla
|
|
sec
|
|
rts
|
|
|
|
L3CB7: ldx $BECF
|
|
stx $BC9B
|
|
lda $BED0
|
|
sta $BCA3
|
|
L3CC3: sta $BED6
|
|
sta $BEC7
|
|
sta $BED2
|
|
ldx $BEB9
|
|
stx $BE5F
|
|
ldx $BEBA
|
|
stx $BE60
|
|
jsr LB3EB
|
|
lda #$7F
|
|
sta $BED3
|
|
lda #$C9
|
|
jsr LBE70
|
|
lda $BE57
|
|
and #$03
|
|
beq L3CF4
|
|
jsr LB522
|
|
bcc L3CF4
|
|
jmp LB245
|
|
|
|
L3CF4: lda #$FF
|
|
sta $BE43
|
|
clc
|
|
rts
|
|
|
|
lda $BE43
|
|
bpl L3D0B
|
|
sta $BE4E
|
|
ldx #$08
|
|
lda $BC9B,x
|
|
jsr LB4A5
|
|
L3D0B: rts
|
|
|
|
bcs L3D47
|
|
lda $BE56
|
|
and #$01
|
|
bne L3D1D
|
|
ldx #$00
|
|
jsr L9F8C
|
|
jsr L9FAB
|
|
L3D1D: clc
|
|
rts
|
|
|
|
lda #$00
|
|
beq L3D2F
|
|
lda $BE56
|
|
and #$01
|
|
beq L3D2F
|
|
jsr LB41F
|
|
bcs L3D37
|
|
L3D2F: sta $BEDE
|
|
lda #$CD
|
|
jsr LBE70
|
|
L3D37: rts
|
|
|
|
php
|
|
jsr LB41F
|
|
bcs L3D4B
|
|
plp
|
|
lda #$14
|
|
sec
|
|
rts
|
|
|
|
L3D43: lda #$0D
|
|
sec
|
|
rts
|
|
|
|
L3D47: lda #$06
|
|
L3D49: sec
|
|
rts
|
|
|
|
L3D4B: plp
|
|
ldx #$00
|
|
ldy #$00
|
|
lda $BE57
|
|
and #$10
|
|
bne L3D5D
|
|
stx $BE60
|
|
sty $BE5F
|
|
L3D5D: lda $BE56
|
|
and #$04
|
|
eor #$04
|
|
beq L3D6B
|
|
lda #$04
|
|
sta $BE6A
|
|
L3D6B: bcc L3D8E
|
|
beq L3D47
|
|
sta $BEB8
|
|
lda #$C3
|
|
sta $BEB7
|
|
ldx $BE60
|
|
ldy $BE5F
|
|
stx $BEA6
|
|
stx $BEBA
|
|
sty $BEA5
|
|
sty $BEB9
|
|
jsr LAD46
|
|
bcs L3D49
|
|
L3D8E: lda $BEB8
|
|
cmp $BE6A
|
|
bne L3D43
|
|
cmp #$04
|
|
bne L3DAD
|
|
ldx $BEBA
|
|
ldy $BEB9
|
|
lda $BE57
|
|
and #$10
|
|
bne L3DAD
|
|
stx $BE60
|
|
sty $BE5F
|
|
L3DAD: jsr LA1F5
|
|
bcs L3D49
|
|
lda $BC88
|
|
sta $BECF
|
|
lda #$07
|
|
sta LEVEL
|
|
lda #$C8
|
|
jsr LBE70
|
|
bcc L3DCB
|
|
pha
|
|
jsr LA24C
|
|
pla
|
|
sec
|
|
rts
|
|
|
|
L3DCB: lda $BEB8
|
|
cmp #$0F
|
|
beq L3DD3
|
|
clc
|
|
L3DD3: lda #$00
|
|
ror a
|
|
sta $BE47
|
|
ldx $BE4D
|
|
lda $BC88
|
|
sta $BC94,x
|
|
lda $BED0
|
|
sta $BC9C,x
|
|
inc $BE4D
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
tax
|
|
lda $0280
|
|
ora $BE47
|
|
sta $BCFE,x
|
|
and #$7F
|
|
tay
|
|
cmp #$1E
|
|
bcc L3E03
|
|
lda #$1D
|
|
L3E03: sta $3A
|
|
lda $BE5F
|
|
sta $BCFF,x
|
|
lda $BE60
|
|
sta $BD00,x
|
|
L3E11: inx
|
|
lda $0280,y
|
|
sta $BD00,x
|
|
dey
|
|
dec $3A
|
|
bne L3E11
|
|
clc
|
|
rts
|
|
|
|
lda $BE56
|
|
and #$01
|
|
bne L3E2A
|
|
lda #$10
|
|
sec
|
|
rts
|
|
|
|
L3E2A: ldx $BE4D
|
|
beq L3E48
|
|
stx $BE4E
|
|
L3E32: stx $3B
|
|
lda $BC9B,x
|
|
jsr LB462
|
|
bne L3E43
|
|
ldx $3B
|
|
L3E3E: lda $BC9B,x
|
|
L3E41: clc
|
|
rts
|
|
|
|
L3E43: ldx $3B
|
|
dex
|
|
bne L3E32
|
|
L3E48: lda $BE43
|
|
bpl L3E5E
|
|
lda $BCA3
|
|
jsr LB462
|
|
bne L3E5E
|
|
lda #$FF
|
|
sta $BE4E
|
|
ldx #$08
|
|
bne L3E3E
|
|
L3E5E: lda #$12
|
|
sec
|
|
rts
|
|
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
tax
|
|
lda $BCFE,x
|
|
sta $BE47
|
|
and #$7F
|
|
cmp $0280
|
|
bne L3E98
|
|
tay
|
|
cmp #$1E
|
|
bcc L3E7C
|
|
lda #$1D
|
|
L3E7C: sta $3A
|
|
lda $BCFF,x
|
|
sta $BCA4
|
|
lda $BD00,x
|
|
sta $BCA5
|
|
L3E8A: inx
|
|
lda $0280,y
|
|
cmp $BD00,x
|
|
bne L3E98
|
|
dey
|
|
dec $3A
|
|
bne L3E8A
|
|
L3E98: rts
|
|
|
|
lda $BE56
|
|
and #$01
|
|
beq L3EF2
|
|
jsr LB41F
|
|
bcs L3E41
|
|
sta $BEDE
|
|
lda $BC93,x
|
|
sta $BC88
|
|
bit $BE4E
|
|
bmi L3ECF
|
|
ldy $BE4D
|
|
pha
|
|
lda $BC93,y
|
|
sta $BC93,x
|
|
pla
|
|
sta $BC93,y
|
|
lda $BC9B,x
|
|
pha
|
|
lda $BC9B,y
|
|
sta $BC9B,x
|
|
pla
|
|
sta $BC9B,y
|
|
L3ECF: lda #$00
|
|
sta LEVEL
|
|
lda #$CC
|
|
jsr LBE70
|
|
bcs L3F02
|
|
jsr LA24C
|
|
bit $BE4E
|
|
bpl L3EEE
|
|
pha
|
|
lda #$00
|
|
sta $BE43
|
|
sta $BE4E
|
|
pla
|
|
rts
|
|
|
|
L3EEE: dec $BE4D
|
|
rts
|
|
|
|
L3EF2: ldx $BE4D
|
|
beq L3F03
|
|
stx $BE4E
|
|
lda $BC9B,x
|
|
jsr LB4A5
|
|
bcc L3EF2
|
|
L3F02: rts
|
|
|
|
L3F03: lda #$00
|
|
sta $BEDE
|
|
lda #$07
|
|
sta LEVEL
|
|
lda #$CC
|
|
jmp LBE70
|
|
|
|
jsr LB41F
|
|
bcs L3F7F
|
|
sta $BED6
|
|
sta $BED2
|
|
bit $BE47
|
|
bmi L3F80
|
|
.byte $AD
|
|
.byte $57
|
|
ldx $0329,y
|
|
beq L3F7D
|
|
cmp #$03
|
|
beq L3F7D
|
|
and #$01
|
|
beq L3F3D
|
|
copy16 $BE65, $BE63
|
|
L3F3D: copy16 #$00EF, $BED9
|
|
sta $BED7
|
|
lda #$02
|
|
sta $BED8
|
|
lda #$7F
|
|
sta $BED3
|
|
lda #$C9
|
|
jsr LBE70
|
|
bcs L3F7F
|
|
L3F5B: lda $BE63
|
|
ora $BE64
|
|
clc
|
|
beq L3F80
|
|
lda #$CA
|
|
jsr LBE70
|
|
bcs L3F7F
|
|
lda $BE63
|
|
sbc #$00
|
|
sta $BE63
|
|
lda $BE64
|
|
sbc #$00
|
|
sta $BE64
|
|
bcs L3F5B
|
|
L3F7D: lda #$0B
|
|
L3F7F: sec
|
|
L3F80: rts
|
|
|
|
copy16 $BCA4, $BCAF
|
|
lda #$00
|
|
sta $BCB1
|
|
sta $BCB2
|
|
sta $BEC8
|
|
sta $BEC9
|
|
sta $BECA
|
|
L3F9E: lsr16 $BE65
|
|
ldx #$00
|
|
bcc L3FBF
|
|
clc
|
|
L3FA9: lda $BCAF,x
|
|
adc $BEC8,x
|
|
sta $BEC8,x
|
|
inx
|
|
txa
|
|
eor #$03
|
|
bne L3FA9
|
|
bcs L3FD2
|
|
ldx $BCB2
|
|
bne L3FD2
|
|
L3FBF: rol $BCAF,x
|
|
inx
|
|
txa
|
|
eor #$04
|
|
bne L3FBF
|
|
lda $BE65
|
|
ora $BE66
|
|
bne L3F9E
|
|
clc
|
|
rts
|
|
|
|
L3FD2: lda #$02
|
|
sec
|
|
rts
|
|
|
|
jsr LB41F
|
|
bcs L402B
|
|
sta $BED6
|
|
sta $BEC7
|
|
sta $BED2
|
|
bit $BE47
|
|
bmi L402C
|
|
jsr LB666
|
|
bcs L402B
|
|
ldx #$7F
|
|
ldy #$EF
|
|
lda $BE57
|
|
and #$10
|
|
beq L400C
|
|
ldy $BE5F
|
|
ldx $BE60
|
|
.byte $D0
|
|
|
|
.endproc ; WTF
|