From 5d6a878024b623638ce76bb206834f22923d3d45 Mon Sep 17 00:00:00 2001
From: Joshua Bell <inexorabletash@gmail.com>
Date: Fri, 21 Dec 2018 21:25:12 -0800
Subject: [PATCH] disasm: recursive operations

---
 desktop/desktop_main.s | 179 +++++++++++++++++++++++------------------
 1 file changed, 99 insertions(+), 80 deletions(-)

diff --git a/desktop/desktop_main.s b/desktop/desktop_main.s
index 886686d..eb2aade 100644
--- a/desktop/desktop_main.s
+++ b/desktop/desktop_main.s
@@ -9359,13 +9359,13 @@ jt_get_size:    jmp     do_get_size ; cmd_get_size
 .proc operations
 
 do_copy_file:
-        copy    #0, operation_flags
+        copy    #0, operation_flags ; copy/delete
         tsx
         stx     stack_stash
-        jsr     copy_bytes_and_clear_system_bitmap
+        jsr     prep_op_jt_overlay4_clear_system_bitmap
         jsr     do_copy_dialog_phase
         jsr     LA271
-        jsr     L9968
+        jsr     prep_op_jt_overlay1
 L8F3F:  copy16  #$00FF, LE05B
         jsr     copy_file_with_flag
         jsr     done_dialog_phase1
@@ -9376,24 +9376,24 @@ L8F4F:  jsr     L91E8
         jmp     L8F4F
 
 do_delete_file:
-        copy    #0, operation_flags
+        copy    #0, operation_flags ; copy/delete
         tsx
         stx     stack_stash
-        jsr     copy_bytes_and_clear_system_bitmap
+        jsr     prep_op_jt_overlay4_clear_system_bitmap
         lda     #0
         jsr     do_delete_dialog_phase
         jsr     LA271
         jsr     done_dialog_phase2
-        jsr     L9EBF
+        jsr     prep_op_jt_overlay2
         jsr     delete_file
         jsr     done_dialog_phase1
         jmp     L8F4F
 
 L8F7E:  copy    #$80, L918C
-        copy    #%11000000, operation_flags
+        copy    #%11000000, operation_flags ; get size
         tsx
         stx     stack_stash
-        jsr     copy_bytes_and_clear_system_bitmap
+        jsr     prep_op_jt_overlay4_clear_system_bitmap
         jsr     L9984
         jsr     LA271
         jsr     L99BC
@@ -9423,7 +9423,7 @@ do_unlock:
 
 do_get_size:
         copy    #0, L918C
-        copy    #%11000000, operation_flags
+        copy    #%11000000, operation_flags ; get size
         jmp     L8FEB
 
 .proc do_drop
@@ -9433,9 +9433,8 @@ do_get_size:
         lda     #$80
         bne     set           ; always
 :       lda     #$00
-set:    sta     drop_on_trash_flag
-        lda     #0
-        sta     operation_flags
+set:    sta     delete_flag
+        copy    #0, operation_flags ; copy/delete
         jmp     L8FEB
 .endproc
 
@@ -9443,22 +9442,26 @@ L8FDD:  lda     #$00
         beq     L8FE3
 L8FE1:  lda     #$80
 L8FE3:  sta     unlock_flag
-        copy    #%10000000, operation_flags
+        copy    #%10000000, operation_flags ; lock/unlock
 
 L8FEB:  tsx
         stx     stack_stash
         copy    #0, LE05C
         jsr     L91D5
         lda     operation_flags
-        beq     :+
+        beq     :+              ; copy/delete
         jmp     begin_operation
 
-:       bit     drop_on_trash_flag
-        bpl     compute_target_prefix
+        ;; Copy or delete
+:       bit     delete_flag
+        bpl     compute_target_prefix ; copy
+
+        ;; Delete - is it a volume?
         lda     selected_window_index
         beq     :+
         jmp     begin_operation
 
+        ;; Yes - eject it!
 :       pla
         pla
         jmp     JT_EJECT
@@ -9543,44 +9546,47 @@ L9076:  ldy     #$FF
 .proc begin_operation
         copy    #0, L97E4
 
-        jsr     copy_bytes_and_clear_system_bitmap
+        jsr     prep_op_jt_overlay4_clear_system_bitmap
         bit     operation_flags
-        bvs     L90B4
-        bmi     L90AE
-        bit     drop_on_trash_flag
-        bmi     trash
+        bvs     @size
+        bmi     @lock
+        bit     delete_flag
+        bmi     @trash
 
         jsr     do_copy_dialog_phase
-        jmp     L90DE
+        jmp     iterate_selection
 
-trash:  lda     #6
+@trash: lda     #6
         jsr     do_delete_dialog_phase
-        jmp     L90DE
+        jmp     iterate_selection
 
-L90AE:  jsr     do_lock_dialog_phase
-        jmp     L90DE
+@lock:  jsr     do_lock_dialog_phase
+        jmp     iterate_selection
 
-L90B4:  jsr     do_get_info_dialog_phase
-        jmp     L90DE
+@size:  jsr     do_get_size_dialog_phase
+        jmp     iterate_selection
+
+;;; Perform operation
 
 L90BA:  bit     operation_flags
-        bvs     L90D8
-        bmi     L90D2
-        bit     drop_on_trash_flag
-        bmi     L90CC
-        jsr     L9968
-        jmp     L90DE
+        bvs     @size
+        bmi     @lock
+        bit     delete_flag
+        bmi     @trash
+        jsr     prep_op_jt_overlay1
+        jmp     iterate_selection
 
-L90CC:  jsr     L9EBF
-        jmp     L90DE
+@trash: jsr     prep_op_jt_overlay2
+        jmp     iterate_selection
 
-L90D2:  jsr     LA0DF
-        jmp     L90DE
+@lock:  jsr     prep_op_jt_overlay3
+        jmp     iterate_selection
 
-L90D8:  jsr     LA241
-        jmp     L90DE
+@size:  jsr     LA241
+        jmp     iterate_selection
 
-L90DE:  jsr     get_window_path_ptr
+iterate_selection:
+        jsr     get_window_path_ptr
         lda     selected_icon_count
         bne     :+
         jmp     finish
@@ -9608,8 +9614,8 @@ loop:   jsr     get_window_path_ptr
 L9114:  lda     L97E4
         beq     L913D
         bit     operation_flags
-        bmi     L912F
-        bit     drop_on_trash_flag
+        bmi     @lock_or_size
+        bit     delete_flag
         bmi     :+
         jsr     copy_file
         jmp     next_icon
@@ -9617,11 +9623,12 @@ L9114:  lda     L97E4
 :       jsr     delete_file
         jmp     next_icon
 
-L912F:  bvs     L9137
+@lock_or_size:
+        bvs     @size           ; size?
         jsr     LA114
         jmp     next_icon
 
-L9137:  jsr     LA271
+@size:  jsr     LA271
         jmp     next_icon
 
 L913D:  jsr     LA271
@@ -9636,13 +9643,16 @@ next_icon:
         bne     finish
         inc     L97E4
         bit     operation_flags
-        bmi     L915D
-        bit     drop_on_trash_flag
-        bpl     L9165
-L915D:  jsr     done_dialog_phase2
+        bmi     @lock_or_size
+        bit     delete_flag
+        bpl     not_trash
+
+@lock_or_size:
+        jsr     done_dialog_phase2
         bit     operation_flags
         bvs     finish
-L9165:  jmp     L90BA
+not_trash:
+        jmp     L90BA
 
 finish: jsr     done_dialog_phase1
 
@@ -9691,11 +9701,14 @@ done_dialog_phase3:
 stack_stash:
         .byte   0
 
+        ;; $80 = lock/unlock
+        ;; $C0 = get size (easily probed with oVerflow flag)
+        ;; $00 = copy/delete
 operation_flags:
-        .byte   0               ; flags (bit 7 = ???, bit 6 = ???)
+        .byte   0
 
-        ;; high bit set = drop on trash, clear = otherwise
-drop_on_trash_flag:
+        ;; high bit set = delete, clear = copy
+delete_flag:
         .byte   0
 
         ;; high bit set = unlock, clear = lock
@@ -10418,6 +10431,7 @@ L97AD:  .res    16, 0
 L97BD:  .res    32, 0
 
         ;; overlayed indirect jump table
+        op_jt_addrs_size := 6
 op_jt_addrs:
 op_jt_addr1:  .addr   L9B36
 op_jt_addr2:  .addr   L9B33
@@ -10573,7 +10587,8 @@ op_jt3: jmp     (op_jt_addr3)
 
 L992D:  .byte   $00,$00,$00,$00
 
-L9931:  .addr   L9B36           ; Overlay for op_jt_addrs
+op_jt_overlay1:
+        .addr   L9B36           ; Overlay for op_jt_addrs
         .addr   L9B33
         .addr   rts2
 
@@ -10597,10 +10612,9 @@ L995A:  stax    copy_dialog_params::count
         jmp     launch_copy_file_dialog
 .endproc
 
-L9968:
-        ldy     #5              ; 3 addrs
-:       lda     L9931,y
-        sta     op_jt_addrs,y
+.proc prep_op_jt_overlay1
+        ldy     #op_jt_addrs_size-1
+:       copy    op_jt_overlay1,y,  op_jt_addrs,y
         dey
         bpl     :-
 
@@ -10608,6 +10622,7 @@ L9968:
         sta     LA425
         sta     L918D
         rts
+.endproc
 
 L997C:  lda     #5
         sta     copy_dialog_params
@@ -10629,9 +10644,8 @@ L99A7:  stax    copy_dialog_params::count
 L99BC:  lda     #$80
         sta     L918D
 
-        ldy     #5
-:       lda     L9931,y
-        sta     op_jt_addrs,y
+        ldy     #op_jt_addrs_size-1
+:       copy    op_jt_overlay1,y, op_jt_addrs,y
         dey
         bpl     :-
 
@@ -10672,9 +10686,10 @@ L9A0F:  sta     flag
         sta     copy_dialog_params
         jsr     LA379
         bit     operation_flags
-        bvc     L9A22
+        bvc     @not_size
         jsr     L9BC9
-L9A22:  bit     LE05B
+@not_size:
+        bit     LE05B
         bpl     L9A70
         bvs     L9A50
         lda     flag
@@ -11124,7 +11139,8 @@ L9E71:  sec
         rts
 .endproc
 
-L9E73:  .addr   L9F94           ; Overlay for op_jt_addrs
+op_jt_overlay2:
+        .addr   L9F94           ; Overlay for op_jt_addrs
         .addr   rts2
         .addr   destroy_with_retry
 
@@ -11156,10 +11172,9 @@ L9EBE:  rts
 
 ;;; ============================================================
 
-.proc L9EBF
-        ldy     #5
-:       lda     L9E73,y
-        sta     op_jt_addrs,y
+.proc prep_op_jt_overlay2
+        ldy     #op_jt_addrs_size-1
+:       copy    op_jt_overlay2,y, op_jt_addrs,y
         dey
         bpl     :-
 
@@ -11325,7 +11340,8 @@ done:   rts
 LA044:  yax_call launch_dialog, index_delete_file_dialog, delete_file_dialog_params
         rts
 
-LA04E:  .addr   LA170
+op_jt_overlay3:
+        .addr   LA170           ; overlay for op_jt_addrs
         .addr   rts2
         .addr   rts2
 
@@ -11390,15 +11406,15 @@ LA0D1:  copy    #LockDialogLifecycle::loop, lock_unlock_dialog_params::phase
 
 LA0DE:  rts
 
-.proc LA0DF
+.proc prep_op_jt_overlay3
         lda     #$00
         sta     LA425
 
-        ldy     #5
-:       lda     LA04E,y
-        sta     op_jt_addrs,y
+        ldy     #op_jt_addrs_size-1
+:       copy    op_jt_overlay3,y, op_jt_addrs,y
         dey
         bpl     :-
+
         rts
 .endproc
 
@@ -11506,7 +11522,7 @@ phase:  .byte   0
         .addr   LA2ED, LA2EF
 .endproc
 
-do_get_info_dialog_phase:
+do_get_size_dialog_phase:
         copy    #0, get_size_dialog_params::phase
         copy16  #LA220, dialog_phase2_callback
         copy16  #LA211, dialog_phase0_callback
@@ -11527,16 +11543,19 @@ LA233:  copy    #3, get_size_dialog_params::phase
         yax_call launch_dialog, index_get_size_dialog, get_size_dialog_params
 LA241:  rts
 
-LA242:  .addr   LA2AE,rts2,rts2
+op_jt_overlay4:
+        .addr   LA2AE           ; overlay for op_jt_addrs
+        .addr   rts2
+        .addr   rts2
 
 ;;; ============================================================
 ;;; ???
 
-.proc copy_bytes_and_clear_system_bitmap
+.proc prep_op_jt_overlay4_clear_system_bitmap
         copy    #0, LA425
 
-        ldy     #5              ; 3 addrs
-:       copy    LA242,y, op_jt_addrs,y
+        ldy     #op_jt_addrs_size-1
+:       copy    op_jt_overlay4,y, op_jt_addrs,y
         dey
         bpl     :-
 
@@ -11589,14 +11608,14 @@ LA2AA:  .byte   0
 LA2AB:  jmp     LA2AE
 
 LA2AE:  bit     operation_flags
-        bvc     :+
+        bvc     :+              ; not size
         jsr     append_to_path_220
         yax_call JT_MLI_RELAY, GET_FILE_INFO, file_info_params2
         bne     :+
         add16   LA2EF, file_info_params2::blocks_used, LA2EF
 :       inc16   LA2ED
         bit     operation_flags
-        bvc     :+
+        bvc     :+              ; not size
         jsr     remove_path_segment_220
 :       ldax    LA2ED
         jmp     done_dialog_phase0