diff --git a/desktop.inc b/desktop.inc index 32cfebe..715b337 100644 --- a/desktop.inc +++ b/desktop.inc @@ -193,14 +193,14 @@ last_menu_click_params := $E23D ;;; .res 17 name (name, with a space before and after) .struct IconEntry - id .byte - state .byte - win_type .byte - iconx .word - icony .word - iconbits .addr - len .byte - name .res 17 ; 15 chars plus leading/trailing spaces + id .byte ; 0 + state .byte ; 1 + win_type .byte ; 2 + iconx .word ; 3 + icony .word ; 5 + iconbits .addr ; 7 + len .byte ; 9 + name .res 17 ; 10 (15 chars plus leading/trailing spaces) .endstruct max_icon_count = 127 diff --git a/desktop/desktop_main.s b/desktop/desktop_main.s index 2b08061..0c1311a 100644 --- a/desktop/desktop_main.s +++ b/desktop/desktop_main.s @@ -575,7 +575,7 @@ not_menu: jmp start -L445C: .byte 0 +winid: .byte 0 start: jsr clear_selection @@ -588,24 +588,27 @@ start: jsr clear_selection lda icon_param jsr icon_entry_lookup stax ptr - ldy #1 + + ldy #IconEntry::state ; set state to open lda (ptr),y - beq L44A6 - ora #$80 + beq continue + ora #icon_entry_open_mask sta (ptr),y - iny + + iny ; IconEntry::win_type lda (ptr),y - and #$0F - sta L445C + and #icon_entry_winid_mask + sta winid jsr zero_grafport5_coords DESKTOP_RELAY_CALL DT_HIGHLIGHT_ICON, icon_param jsr reset_grafport3 - copy L445C, selected_window_index + copy winid, selected_window_index copy #1, selected_icon_count copy icon_param, selected_icon_list ;; Actually make the window active. -L44A6: MGTK_RELAY_CALL MGTK::SelectWindow, findwindow_window_id +continue: + MGTK_RELAY_CALL MGTK::SelectWindow, findwindow_window_id copy findwindow_window_id, active_window_id jsr LoadActiveWindowIconTable jsr L6C19 @@ -2962,7 +2965,7 @@ L56F8: .byte 0 L5708: sta $800 ldy #$01 - ldx #$00 + ldx #0 L570F: lda window_to_dir_icon_table,x beq L5720 inx @@ -4041,7 +4044,7 @@ L5E77: .byte 0 lda (ptr),y tay : lda (ptr),y - sta LE1B0,y + sta open_dir_path_buf,y dey bpl :- @@ -4286,26 +4289,30 @@ handle_close_click: rts .proc close_window + icon_ptr := $06 + jsr LoadActiveWindowIconTable + jsr clear_selection ldx active_window_id dex lda win_view_by_table,x - bmi L6215 ; list view, not icons + bmi iter ; list view, not icons lda icon_count sec sbc cached_window_icon_count sta icon_count + DESKTOP_RELAY_CALL DT_CLOSE_WINDOW, active_window_id ldx #$00 L6206: cpx cached_window_icon_count - beq L6215 + beq iter lda cached_window_icon_list,x jsr FreeIcon inx jmp L6206 -L6215: dec num_open_windows +iter: dec num_open_windows ldx #$00 txa L621B: sta cached_window_icon_list,x @@ -5243,7 +5250,7 @@ update_view: jsr icon_window_to_screen jsr reset_grafport3 -skip2: jsr L744B +skip2: jsr prepare_new_window ;; Create the window lda cached_window_id @@ -5842,7 +5849,7 @@ L70C4: .byte $00 sta L72A7 jsr push_pointers - COPY_BYTES $41, LE1B0, path_buffer + COPY_BYTES 65, open_dir_path_buf, path_buffer jsr do_open lda open_params::ref_num @@ -6130,12 +6137,12 @@ get_vol_free_used: .proc L7345 sta L7445 - ldx #$00 + ldx #0 L734A: lda LE1F1+1,x cmp L7445 beq :+ inx - cpx #$08 + cpx #8 bne L734A rts @@ -6214,92 +6221,130 @@ L7449: .word 0 .endproc ;;; ============================================================ +;;; Set up path and coords for new window, contents and free/used. +;;; +;;; Inputs: IconEntry pointer in $06, new window_id in cached_window_id +;;; Outputs: Winfo configured, open_dir_path_buf has full path -.proc L744B +.proc prepare_new_window + icon_ptr := $06 + title_ptr := $08 + + ;; Get icon name length, update ptr lda cached_window_id asl a tax - copy16 LE6BF,x, $08 - ldy #$09 - lda ($06),y - tay + copy16 window_title_addr_table,x, title_ptr + ldy #IconEntry::len + lda (icon_ptr),y + tay ; length in Y jsr push_pointers - lda $06 + lda icon_ptr clc - adc #$09 - sta $06 - bcc L746D - inc $06+1 -L746D: tya - tax - ldy #$00 -L7471: lda ($06),y - sta ($08),y + adc #IconEntry::len + sta icon_ptr + bcc :+ + inc icon_ptr+1 +: tya + tax ; length in X + + ;; Copy name (with leading/trailing spaces) to title + ldy #0 +: lda (icon_ptr),y + sta (title_ptr),y iny dex - bne L7471 - lda #$20 - sta ($08),y + bne :- + + lda #' ' + sta (title_ptr),y ldy #IconEntry::win_type - lda ($08),y - and #%11011111 ; ??? - sta ($08),y + lda (title_ptr),y + and #%11011111 ; upcase first letter + sta (title_ptr),y + jsr pop_pointers + + ;; Is there a parent window? ldy #IconEntry::win_type - lda ($06),y + lda (icon_ptr),y and #icon_entry_winid_mask - bne L74D3 + bne has_parent + + ;; -------------------------------------------------- + ;; Desktop (volume) icon; no parent path + + path_ptr := $08 + jsr push_pointers lda cached_window_id jsr window_path_lookup - stax $08 - lda $06 + stax path_ptr + + ;; Point at length-prefixed icon name (with leading/trailing spaces) + lda icon_ptr clc - adc #$09 - sta $06 - bcc L74A8 - inc $06+1 -L74A8: ldy #$00 + adc #IconEntry::len + sta icon_ptr + bcc :+ + inc icon_ptr+1 +: ldy #0 lda ($06),y - tay -L74AD: lda ($06),y - sta ($08),y + tay ; Y = length + + ;; Copy, including leading/trailing spaces +: lda (icon_ptr),y + sta (path_ptr),y dey - bpl L74AD - ldy #$00 - lda ($08),y + bpl :- + + ;; Reduce length by one (trailing space) + ldy #0 + lda (path_ptr),y sec - sbc #$01 - sta ($08),y + sbc #1 + sta (path_ptr),y + + ;; Convert leading space to '/' ldy #1 lda #'/' - sta ($08),y - ldy #$00 - lda ($08),y - tay -L74C8: lda ($08),y - sta LE1B0,y - dey - bpl L74C8 - jmp L7569 + sta (path_ptr),y -L74D3: tay - copy #$00, L7620 + ;; Copy path to open_dir_path_buf ??? + ldy #0 + lda (path_ptr),y + tay +: lda (path_ptr),y + sta open_dir_path_buf,y + dey + bpl :- + + jmp common + + ;; -------------------------------------------------- + ;; Windowed (folder) icon; has a parent path + + parent_path_ptr := $06 + +has_parent: + tay + copy #$00, L7620 ; ??? jsr push_pointers tya pha jsr window_path_lookup - stax $06 + stax parent_path_ptr pla asl a tax - copy16 LE6BF,x, $08 - ldy #$00 - lda ($06),y + copy16 window_title_addr_table,x, title_ptr + ldy #0 + lda (parent_path_ptr),y clc - adc ($08),y - cmp #$43 - bcc L750D + adc (title_ptr),y + cmp #67 ; Max path length is 64; title has leading/trailing spaces + bcc :+ + lda #ERR_INVALID_PATHNAME jsr ShowAlert jsr mark_icons_not_opened_2 @@ -6308,102 +6353,133 @@ L74D3: tay txs rts -L750D: ldy #0 - lda ($06),y + ;; Copy parent path to open_dir_path_buf +: ldy #0 + lda (parent_path_ptr),y tay -L7512: lda ($06),y - sta LE1B0,y +: lda (parent_path_ptr),y + sta open_dir_path_buf,y dey - bpl L7512 + bpl :- + + ;; Suffix with '/' lda #'/' - sta LE1B0+1 - inc LE1B0 - ldx LE1B0 - sta LE1B0,x + sta open_dir_path_buf+1 + inc open_dir_path_buf + ldx open_dir_path_buf + sta open_dir_path_buf,x + + icon_ptr2 := $08 + + ;; Append icon name lda icon_params2 jsr icon_entry_lookup - stax $08 - ldx LE1B0 - ldy #$09 - lda ($08),y + stax icon_ptr2 + ldx open_dir_path_buf + ldy #IconEntry::len ; compute total length + lda (icon_ptr2),y clc - adc LE1B0 - sta LE1B0 - dec LE1B0 - dec LE1B0 - ldy #$0A -L7548: iny + adc open_dir_path_buf + sta open_dir_path_buf + dec open_dir_path_buf ; discount leading/trailing spaces + dec open_dir_path_buf + ldy #IconEntry::name + +: iny ; skip leading space immediately inx - lda ($08),y - sta LE1B0,x - cpx LE1B0 - bne L7548 + lda (icon_ptr2),y + sta open_dir_path_buf,x + cpx open_dir_path_buf + bne :- + + ;; Copy into window path lda cached_window_id jsr window_path_lookup - stax $08 - ldy LE1B0 -L7561: lda LE1B0,y - sta ($08),y + stax path_ptr + ldy open_dir_path_buf +: lda open_dir_path_buf,y + sta (path_ptr),y dey - bpl L7561 -L7569: lda cached_window_id + bpl :- + + ;; -------------------------------------------------- + +common: + winfo_ptr := $06 + + ;; Set window coordinates + lda cached_window_id jsr window_lookup - stax $06 - ldy #$14 + stax winfo_ptr + ldy #MGTK::Winfo::port + + ;; xcoord = (window_id-1) * 16 + 5 + ;; ycoord = (window_id-1) * 8 + 27 + lda cached_window_id sec - sbc #$01 + sbc #1 ; * 16 asl a asl a asl a asl a + pha - adc #$05 - sta ($06),y + adc #5 + sta (winfo_ptr),y ; viewloc::xcoord iny - lda #$00 - sta ($06),y + lda #0 + sta (winfo_ptr),y iny pla - lsr a + + lsr a ; / 2 clc - adc #.sizeof(IconEntry) - sta ($06),y + adc #27 + sta (winfo_ptr),y ; viewloc::ycoord iny - lda #$00 - sta ($06),y - lda #$00 - ldy #$1F - ldx #$03 -L75A3: sta ($06),y + lda #0 + sta (winfo_ptr),y + + ;; Map rect + lda #0 + ldy #MGTK::Winfo::port + MGTK::GrafPort::maprect + 3 + ldx #3 +: sta (winfo_ptr),y dey dex - bpl L75A3 - ldy #$04 - lda ($06),y - and #$FE - sta ($06),y + bpl :- + + ;; Scrollbars + ldy #MGTK::Winfo::hscroll + lda (winfo_ptr),y + and #AS_BYTE(~MGTK::Scroll::option_active) + sta (winfo_ptr),y iny - lda ($06),y - and #$FE - sta ($06),y - lda #$00 - ldy #$07 - sta ($06),y - ldy #$09 - sta ($06),y + lda (winfo_ptr),y + and #AS_BYTE(~MGTK::Scroll::option_active) + sta (winfo_ptr),y + + lda #0 + ldy #MGTK::Winfo::hthumbpos + sta (winfo_ptr),y + ldy #MGTK::Winfo::vthumbpos + sta (winfo_ptr),y jsr pop_pointers + + ;; -------------------------------------------------- + lda icon_params2 jsr open_directory lda icon_params2 jsr icon_entry_lookup - stax $06 + stax icon_ptr ldy #IconEntry::win_type - lda ($06),y + lda (icon_ptr),y and #icon_entry_winid_mask - beq L75FA + beq :+ tax dex txa @@ -6411,7 +6487,8 @@ L75A3: sta ($06),y tax copy16 window_k_used_table,x, vol_kb_used copy16 window_k_free_table,x, vol_kb_free -L75FA: ldx cached_window_id + +: ldx cached_window_id dex txa asl a diff --git a/desktop/desktop_res.s b/desktop/desktop_res.s index 0a842c5..f4e5c5f 100644 --- a/desktop/desktop_res.s +++ b/desktop/desktop_res.s @@ -984,7 +984,9 @@ devlst_backup: device_to_icon_map: .res 16, 0 -LE1B0: .res 65, 0 ; path buffer? +;;; Path buffer for open_directory logic +open_dir_path_buf: + .res 65, 0 LE1F1: .res 15, 0 ; length-prefixed string LE200: .word 0 LE202: .res 24, 0 ; addr table @@ -1197,9 +1199,8 @@ dummy_dd_item: icon_params2: .byte 0 -LE6BF: .word 0 - -LE6C1: +window_title_addr_table: + .addr 0 .addr winfo1title_ptr .addr winfo2title_ptr .addr winfo3title_ptr diff --git a/desktop/ovl1a.s b/desktop/ovl1a.s index e97628d..c78d4ca 100644 --- a/desktop/ovl1a.s +++ b/desktop/ovl1a.s @@ -59,7 +59,7 @@ L183F: sta BITMAP+1,x lda LCBANK1 lda LCBANK1 - jmp MGTK_RELAY + jmp disk_copy_overlay3_start ;;; ============================================================ ;;; Copy first chunk to the Language Card diff --git a/desktop/ovl1b.s b/desktop/ovl1b.s index 2f2ee91..664d77c 100644 --- a/desktop/ovl1b.s +++ b/desktop/ovl1b.s @@ -45,7 +45,12 @@ L12AF := $12AF .endif .endmacro - jmp LD5E1 +;;; ============================================================ + + .assert *= $D000, error, "Entry point mismatch" + +start: + jmp init ;;; ============================================================ ;;; Resources @@ -497,7 +502,8 @@ watch_cursor: ;;; ============================================================ LD5E0: .byte 0 -LD5E1: jsr remove_ram_disk + +init: jsr remove_ram_disk MGTK_RELAY_CALL2 MGTK::SetMenu, menu_definition jsr set_cursor_pointer copy #1, checkitem_params::menu_item @@ -3137,3 +3143,4 @@ show_alert_dialog := alert_dialog::show_alert_dialog PAD_TO $F200 .endproc + disk_copy_overlay3_start := disk_copy_overlay3::start