;;; ============================================================ ;;; Overlay for Common Routines (Selector, File Copy/Delete) ;;; ============================================================ .proc common_overlay .org $5000 ;;; ============================================================ L5000: jmp L50B1 DEFINE_ON_LINE_PARAMS on_line_params,, on_line_buffer DEFINE_OPEN_PARAMS open_params, path_buf, $1000 DEFINE_READ_PARAMS read_params, $1400, $200 DEFINE_CLOSE_PARAMS close_params on_line_buffer: .res 16, 0 device_num: .byte $00 ; next device number to try path_buf: .res 128, 0 L50A8: .byte $00 L50A9: .byte $00 ;;; ============================================================ stash_stack: .byte 0 routine_table: .addr $7000, $7000, $7000 .proc L50B1 sty stash_y stx stash_x tsx stx stash_stack pha lda #0 sta device_num sta L50A8 sta prompt_ip_flag sta LD8EC sta LD8F0 sta LD8F1 sta LD8F2 sta cursor_ip_flag sta L5104 sta L5103 sta L5105 lda #prompt_insertion_point_blink_count sta prompt_ip_counter lda #$FF sta LD920 pla asl a tax copy16 routine_table,x, @jump ldy stash_y ldx stash_x @jump := *+1 jmp dummy1234 stash_x: .byte 0 stash_y: .byte 0 .endproc ;;; ============================================================ ;;; Flags set by invoker to alter behavior L5103: .byte 0 ; ??? something before jt_handle_click invoked L5104: .byte 0 ; ??? something about inputs L5105: .byte 0 ; ??? something about the picker ;;; ============================================================ L5106: bit LD8EC bpl :+ dec prompt_ip_counter bne :+ jsr jt_blink_ip copy #prompt_insertion_point_blink_count, prompt_ip_counter : MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_down bne :+ jsr L51AF jmp L5106 : cmp #MGTK::EventKind::key_down bne :+ jsr L59B9 : MGTK_RELAY_CALL MGTK::FindWindow, findwindow_params lda findwindow_which_area bne :+ jmp L5106 : lda findwindow_window_id cmp winfo_entrydlg beq L5151 jmp L5106 L5151: lda winfo_entrydlg jsr set_port_for_window lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx bit L51AE bmi L5183 MGTK_RELAY_CALL MGTK::InRect, common_input1_rect cmp #MGTK::inrect_inside bne L5196 beq L5190 L5183: MGTK_RELAY_CALL MGTK::InRect, common_input2_rect cmp #MGTK::inrect_inside bne L5196 L5190: jsr set_cursor_insertion jmp L5199 L5196: jsr set_cursor_pointer L5199: MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 jmp L5106 L51AE: .byte 0 ;;; ============================================================ L51AF: MGTK_RELAY_CALL MGTK::FindWindow, findwindow_params lda findwindow_which_area bne :+ rts : cmp #MGTK::Area::content bne :+ jmp L51C7 rts ; ??? : rts L51C7: lda findwindow_window_id cmp winfo_entrydlg beq L51D2 jmp L531F L51D2: lda winfo_entrydlg jsr set_port_for_window lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx ;; In open button? .proc check_open_button MGTK_RELAY_CALL MGTK::InRect, common_open_button_rect cmp #MGTK::inrect_inside beq clicked jmp check_change_drive_button clicked: bit L5105 bmi L520A lda LD920 bpl L520D L520A: jmp set_up_ports L520D: tax lda $1780,x bmi L5216 L5213: jmp set_up_ports L5216: lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect jsr track_open_button_click bmi L5213 jsr L5607 jmp set_up_ports .endproc .proc check_change_drive_button MGTK_RELAY_CALL MGTK::InRect, common_change_drive_button_rect cmp #MGTK::inrect_inside beq :+ jmp check_close_button : bit L5105 bmi L5268 MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_change_drive_button_rect jsr track_change_drive_button_click bmi L5268 jsr L565C L5268: jmp set_up_ports .endproc .proc check_close_button MGTK_RELAY_CALL MGTK::InRect, common_close_button_rect cmp #MGTK::inrect_inside beq :+ jmp check_ok_button : bit L5105 bmi L529A MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_close_button_rect jsr track_close_button_click bmi L529A jsr L567F L529A: jmp set_up_ports .endproc .proc check_ok_button MGTK_RELAY_CALL MGTK::InRect, common_ok_button_rect cmp #MGTK::inrect_inside beq :+ jmp check_cancel_button : MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect jsr track_ok_button_click bmi L52CA jsr jt_handle_meta_right_key jsr jt_handle_ok L52CA: jmp set_up_ports .endproc .proc check_cancel_button MGTK_RELAY_CALL MGTK::InRect, common_cancel_button_rect cmp #MGTK::inrect_inside beq :+ jmp check_other_click : MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_cancel_button_rect jsr track_cancel_button_click bmi L52F7 jsr jt_handle_cancel L52F7: jmp set_up_ports .endproc .proc check_other_click bit L5103 bpl :+ jsr L531B bmi set_up_ports : jsr jt_handle_click rts .endproc set_up_ports: MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport2 rts L531B: jsr noop rts L531F: bit L5105 bmi L5340 MGTK_RELAY_CALL MGTK::FindControl, findcontrol_params lda findcontrol_which_ctl beq L5341 cmp #MGTK::Ctl::vertical_scroll_bar bne L5340 lda winfo_entrydlg_file_picker::vscroll and #$01 beq L5340 jmp L5469 L5340: rts L5341: lda winfo_entrydlg_file_picker sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params add16 screentowindow_windowy, winfo_entrydlg_file_picker::cliprect+2, screentowindow_windowy lsr16 screentowindow_windowy lsr16 screentowindow_windowy lsr16 screentowindow_windowy lda LD920 cmp screentowindow_windowy beq L5380 jmp L542F L5380: jsr detect_double_click beq L5386 rts L5386: ldx LD920 lda $1780,x bmi L53B5 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect jsr jt_handle_ok jmp L5340 L53B5: and #$7F pha lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect lda #$00 sta L542E copy16 #$1800, $08 pla asl a rol L542E asl a rol L542E asl a rol L542E asl a rol L542E clc adc $08 sta $08 lda L542E adc $09 sta $09 ldx $09 lda $08 jsr L5F0D jsr L5F5B jsr L6161 lda #$00 jsr L6227 jsr L61B1 jsr L606D MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport2 rts L542E: .byte 0 L542F: lda screentowindow_windowy cmp $177F bcc L5438 rts L5438: lda LD920 bmi L5446 jsr jt_strip_path_segment lda LD920 jsr L6274 L5446: lda screentowindow_windowy sta LD920 bit LD8F0 bpl L5457 jsr jt_prep_path jsr jt_redraw_input L5457: lda LD920 jsr L6274 jsr jt_05 jsr detect_double_click bmi L5468 jmp L5386 L5468: rts L5469: lda findcontrol_which_part cmp #MGTK::Part::up_arrow bne L5473 jmp L550A L5473: cmp #MGTK::Part::down_arrow bne L547A jmp L5533 L547A: cmp #MGTK::Part::page_up bne L5481 jmp L54BA L5481: cmp #MGTK::Part::page_down bne L5488 jmp L54DF L5488: lda #MGTK::Ctl::vertical_scroll_bar sta trackthumb_params MGTK_RELAY_CALL MGTK::TrackThumb, trackthumb_params lda trackthumb_thumbmoved bne :+ rts : lda trackthumb_thumbpos sta updatethumb_thumbpos lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params lda updatethumb_stash jsr L6227 jsr L606D rts L54BA: lda winfo_entrydlg_file_picker::vthumbpos sec sbc #$09 bpl L54C4 lda #$00 L54C4: sta updatethumb_thumbpos lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params lda updatethumb_thumbpos jsr L6227 jsr L606D rts L54DF: lda winfo_entrydlg_file_picker::vthumbpos clc adc #$09 cmp $177F beq L54EF bcc L54EF lda $177F L54EF: sta updatethumb_thumbpos lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params lda updatethumb_thumbpos jsr L6227 jsr L606D rts L550A: lda winfo_entrydlg_file_picker::vthumbpos bne L5510 rts L5510: sec sbc #$01 sta updatethumb_thumbpos lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params lda updatethumb_thumbpos jsr L6227 jsr L606D jsr L555F jmp L550A L5533: lda winfo_entrydlg_file_picker::vthumbpos cmp winfo_entrydlg_file_picker::vthumbmax bne L553C rts L553C: clc adc #$01 sta updatethumb_thumbpos lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params lda updatethumb_thumbpos jsr L6227 jsr L606D jsr L555F jmp L5533 L555F: MGTK_RELAY_CALL MGTK::PeekEvent, event_params lda event_kind cmp #MGTK::EventKind::button_down beq L5576 cmp #MGTK::EventKind::drag beq L5576 pla pla rts L5576: MGTK_RELAY_CALL MGTK::GetEvent, event_params MGTK_RELAY_CALL MGTK::FindWindow, findwindow_params lda findwindow_window_id cmp winfo_entrydlg_file_picker beq :+ pla pla rts : lda findwindow_which_area cmp #MGTK::Area::content beq :+ pla pla rts : MGTK_RELAY_CALL MGTK::FindControl, findcontrol_params lda findcontrol_which_ctl cmp #MGTK::Ctl::vertical_scroll_bar beq :+ pla pla rts : lda findcontrol_which_part cmp #MGTK::Part::page_up bcc L55B9 pla pla L55B9: rts ;;; ============================================================ .proc set_cursor_pointer bit cursor_ip_flag bpl done MGTK_RELAY_CALL MGTK::HideCursor MGTK_RELAY_CALL MGTK::SetCursor, pointer_cursor MGTK_RELAY_CALL MGTK::ShowCursor lda #$00 sta cursor_ip_flag done: rts .endproc .proc set_cursor_insertion bit cursor_ip_flag bmi done MGTK_RELAY_CALL MGTK::HideCursor MGTK_RELAY_CALL MGTK::SetCursor, insertion_point_cursor MGTK_RELAY_CALL MGTK::ShowCursor lda #$80 sta cursor_ip_flag done: rts .endproc cursor_ip_flag: ; high bit set when cursor is IP .byte 0 ;;; ============================================================ L5607: ldx LD920 lda $1780,x and #$7F pha bit LD8F0 bpl L5618 jsr jt_prep_path L5618: lda #$00 sta L565B copy16 #$1800, $08 pla asl a rol L565B asl a rol L565B asl a rol L565B asl a rol L565B clc adc $08 sta $08 lda L565B adc $09 sta $09 ldx $09 lda $08 jsr L5F0D jsr L5F5B jsr L6161 lda #$00 jsr L6227 jsr L61B1 jsr L606D rts L565B: .byte 0 L565C: lda #$FF sta LD920 jsr inc_device_num jsr device_on_line jsr L5F5B jsr L6161 lda #$00 jsr L6227 jsr L61B1 jsr L606D jsr jt_prep_path jsr jt_redraw_input rts L567F: lda #$00 sta L56E2 ldx path_buf bne L568C jmp L56E1 L568C: lda path_buf,x and #CHAR_MASK cmp #'/' beq L569B dex bpl L568C jmp L56E1 L569B: cpx #$01 bne L56A2 jmp L56E1 L56A2: jsr L5F49 lda LD920 pha lda #$FF sta LD920 jsr L5F5B jsr L6161 lda #$00 jsr L6227 jsr L61B1 jsr L606D pla sta LD920 bit L56E2 bmi L56D6 jsr jt_strip_path_segment lda LD920 bmi L56DC jsr jt_strip_path_segment jmp L56DC L56D6: jsr jt_prep_path jsr jt_redraw_input L56DC: lda #$FF sta LD920 L56E1: rts L56E2: .byte 0 L56E3: MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 rts ;;; ============================================================ .proc track_ok_button_click lda #$00 sta L577B L56FB: MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_up beq L575E lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_ok_button_rect cmp #MGTK::inrect_inside beq L5738 lda L577B beq L5740 jmp L56FB L5738: lda L577B bne L5740 jmp L56FB L5740: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect lda L577B clc adc #$80 sta L577B jmp L56FB L575E: lda L577B beq L5766 return #$FF L5766: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect return #$00 L577B: .byte 0 .endproc ;;; ============================================================ .proc track_close_button_click lda #$00 sta L5801 L5781: MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_up beq L57E4 lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_close_button_rect cmp #MGTK::inrect_inside beq L57BE lda L5801 beq L57C6 jmp L5781 L57BE: lda L5801 bne L57C6 jmp L5781 L57C6: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_close_button_rect lda L5801 clc adc #$80 sta L5801 jmp L5781 L57E4: lda L5801 beq L57EC return #$FF L57EC: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_close_button_rect return #$00 L5801: .byte 0 .endproc ;;; ============================================================ .proc track_cancel_button_click lda #$00 sta L5887 L5807: MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_up beq L586A lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_cancel_button_rect cmp #MGTK::inrect_inside beq L5844 lda L5887 beq L584C jmp L5807 L5844: lda L5887 bne L584C jmp L5807 L584C: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_cancel_button_rect lda L5887 clc adc #$80 sta L5887 jmp L5807 L586A: lda L5887 beq L5872 return #$FF L5872: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_cancel_button_rect return #$01 L5887: .byte 0 .endproc ;;; ============================================================ .proc track_open_button_click lda #$00 sta L590D L588D: MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_up beq L58F0 lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_open_button_rect cmp #MGTK::inrect_inside beq L58CA lda L590D beq L58D2 jmp L588D L58CA: lda L590D bne L58D2 jmp L588D L58D2: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect lda L590D clc adc #$80 sta L590D jmp L588D L58F0: lda L590D beq L58F8 return #$FF L58F8: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect return #$00 L590D: .byte 0 .endproc ;;; ============================================================ .proc track_change_drive_button_click lda #$00 sta L5993 L5913: MGTK_RELAY_CALL MGTK::GetEvent, event_params lda event_kind cmp #MGTK::EventKind::button_up beq L5976 lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_change_drive_button_rect cmp #MGTK::inrect_inside beq L5950 lda L5993 beq L5958 jmp L5913 L5950: lda L5993 bne L5958 jmp L5913 L5958: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_change_drive_button_rect lda L5993 clc adc #$80 sta L5993 jmp L5913 L5976: lda L5993 beq L597E return #$FF L597E: MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_change_drive_button_rect return #$01 L5993: .byte 0 .endproc ;;; ============================================================ .proc MLI_RELAY sty call stax params php sei sta ALTZPOFF lda ROMIN2 jsr MLI call: .byte 0 params: .addr 0 sta ALTZPON tax lda LCBANK1 lda LCBANK1 plp txa rts .endproc ;;; ============================================================ .proc noop rts .endproc ;;; ============================================================ ;;; Key handler .proc L59B9 lda event_modifiers beq L59F7 ;; With modifiers lda event_key and #CHAR_MASK cmp #CHAR_LEFT bne :+ jmp jt_handle_meta_left_key ; start of line : cmp #CHAR_RIGHT bne :+ jmp jt_handle_meta_right_key ; end of line : bit L5105 bmi L59E4 cmp #CHAR_DOWN bne :+ jmp scroll_list_bottom ; end of list : cmp #CHAR_UP bne L59E4 jmp scroll_list_top ; start of list L59E4: cmp #'0' bcc :+ cmp #'9'+1 bcs :+ jmp key_meta_digit : bit L5105 bmi L5A4F jmp L5B70 ;;; ============================================================ ;;; Key - without modifiers L59F7: lda event_key and #CHAR_MASK cmp #CHAR_LEFT bne :+ jmp jt_handle_left_key : cmp #CHAR_RIGHT bne :+ jmp jt_handle_right_key : cmp #CHAR_RETURN bne :+ jmp key_return : cmp #CHAR_ESCAPE bne :+ jmp key_escape : cmp #CHAR_DELETE bne :+ jmp key_delete : bit L5105 bpl L5A27 jmp L5AC4 L5A27: cmp #CHAR_TAB bne L5A52 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_change_drive_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_change_drive_button_rect jsr L565C L5A4F: jmp L5AC8 L5A52: cmp #CHAR_CTRL_O ; Open bne L5A8B lda LD920 bmi L5AC8 tax lda $1780,x bmi :+ jmp L5AC8 : lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_open_button_rect jsr L5607 jmp L5AC8 L5A8B: cmp #CHAR_CTRL_C ; Close bne :+ lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, common_close_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_close_button_rect jsr L567F jmp L5AC8 : cmp #CHAR_DOWN bne :+ jmp key_down : cmp #CHAR_UP bne L5AC4 jmp key_up L5AC4: jsr jt_handle_other_key rts L5AC8: jsr L56E3 rts key_return: lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR ; flash the button MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_ok_button_rect jsr jt_handle_meta_right_key jsr jt_handle_ok jsr L56E3 rts key_escape: lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR ; flash the button MGTK_RELAY_CALL MGTK::PaintRect, common_cancel_button_rect MGTK_RELAY_CALL MGTK::PaintRect, common_cancel_button_rect jsr jt_handle_cancel jsr L56E3 rts key_delete: jsr jt_handle_delete_key rts key_meta_digit: jmp noop .proc key_down lda $177F beq L5B37 lda LD920 bmi L5B47 tax inx cpx $177F bcc L5B38 L5B37: rts L5B38: jsr L6274 jsr jt_strip_path_segment inc LD920 lda LD920 jmp update_list_selection L5B47: lda #0 jmp update_list_selection .endproc .proc key_up lda $177F beq L5B58 lda LD920 bmi L5B68 bne L5B59 L5B58: rts L5B59: jsr L6274 jsr jt_strip_path_segment dec LD920 lda LD920 jmp update_list_selection L5B68: ldx $177F dex txa jmp update_list_selection .endproc L5B70: cmp #'A' ; upper alpha? bcs :+ done: rts : cmp #'Z'+1 bcc L5B83 cmp #'a' ; Lower alpha? bcc done cmp #'z'+1 bcs done and #$5F ; convert lowercase to uppercase L5B83: jsr L5B9D bmi done cmp LD920 beq done pha lda LD920 bmi L5B99 jsr L6274 jsr jt_strip_path_segment L5B99: pla jmp update_list_selection L5B9D: sta L5BF5 lda #0 sta L5BF3 L5BA5: lda L5BF3 cmp $177F beq L5BC4 jsr L5BCB ldy #1 lda ($06),y cmp L5BF5 bcc L5BBE beq L5BC7 jmp L5BC4 L5BBE: inc L5BF3 jmp L5BA5 L5BC4: return #$FF L5BC7: return L5BF3 L5BCB: tax lda $1780,x and #$7F ldx #$00 stx L5BF4 asl a rol L5BF4 asl a rol L5BF4 asl a rol L5BF4 asl a rol L5BF4 clc adc #$00 sta $06 lda L5BF4 adc #$18 sta $07 rts L5BF3: .byte 0 L5BF4: .byte 0 L5BF5: .byte 0 .endproc ;;; ============================================================ .proc scroll_list_top lda $177F beq L5C02 lda LD920 bmi L5C09 bne L5C03 L5C02: rts L5C03: jsr L6274 jsr jt_strip_path_segment L5C09: lda #$00 jmp update_list_selection .endproc .proc scroll_list_bottom lda $177F beq L5C1E ldx LD920 bmi L5C27 inx cpx $177F bne L5C1F L5C1E: rts L5C1F: dex txa jsr L6274 jsr jt_strip_path_segment L5C27: ldx $177F dex txa jmp update_list_selection .endproc ;;; ============================================================ .proc update_list_selection sta LD920 jsr jt_05 lda LD920 jsr L6586 jsr L6163 jsr L606D copy #1, path_buf2 copy #' ', path_buf2+1 jsr jt_redraw_input rts .endproc ;;; ============================================================ ;;; Detect double-click in file list .proc detect_double_click double_click_deltax = 5 double_click_deltay = 4 COPY_STRUCT MGTK::Point, event_coords, coords ;; Initialize counter (varies based on machine type) lda machine_type sta counter ;; Decrement counter, bail if time delta exceeded loop: dec counter beq exit MGTK_RELAY_CALL MGTK::PeekEvent, event_params ;; Check coords, bail if pixel delta exceeded jsr check_delta bmi exit copy #$FF, unused ; unused ??? lda event_kind sta kind ; unused ??? cmp #MGTK::EventKind::no_event beq loop cmp #MGTK::EventKind::drag beq loop cmp #MGTK::EventKind::button_up bne :+ MGTK_RELAY_CALL MGTK::GetEvent, event_params jmp loop : cmp #MGTK::EventKind::button_down bne exit MGTK_RELAY_CALL MGTK::GetEvent, event_params return #0 ; double-click exit: return #$FF ; not double-click .proc check_delta ;; compute x delta lda event_xcoord sec sbc xcoord sta delta lda event_xcoord+1 sbc xcoord+1 bpl :+ ;; is -delta < x < 0 ? lda delta cmp #AS_BYTE(-double_click_deltax) bcs check_y fail: return #$FF : lda delta cmp #double_click_deltax bcs fail ;; compute y delta check_y: lda event_ycoord sec sbc ycoord sta delta lda event_ycoord+1 sbc ycoord+1 bpl :+ ;; is -delta < y < 0 ? lda delta cmp #AS_BYTE(-double_click_deltay) bcs ok : lda delta cmp #double_click_deltay bcs fail ok: return #0 .endproc counter: .byte 0 coords: xcoord: .word 0 ycoord: .word 0 delta: .byte 0 kind: .byte 0 unused: .byte 0 .endproc ;;; ============================================================ .proc create_common_dialog MGTK_RELAY_CALL MGTK::OpenWindow, winfo_entrydlg MGTK_RELAY_CALL MGTK::OpenWindow, winfo_entrydlg_file_picker lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::FrameRect, common_dialog_frame_rect MGTK_RELAY_CALL MGTK::FrameRect, common_ok_button_rect MGTK_RELAY_CALL MGTK::FrameRect, common_open_button_rect MGTK_RELAY_CALL MGTK::FrameRect, common_close_button_rect MGTK_RELAY_CALL MGTK::FrameRect, common_cancel_button_rect MGTK_RELAY_CALL MGTK::FrameRect, common_change_drive_button_rect jsr draw_ok_button_label jsr draw_open_button_label jsr draw_close_button_label jsr draw_cancel_button_label jsr draw_change_drive_button_label MGTK_RELAY_CALL MGTK::MoveTo, common_dialog_sep_start MGTK_RELAY_CALL MGTK::LineTo, common_dialog_sep_end MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 rts .endproc draw_ok_button_label: MGTK_RELAY_CALL MGTK::MoveTo, ok_button_pos addr_call draw_string, ok_button_label rts draw_open_button_label: MGTK_RELAY_CALL MGTK::MoveTo, open_button_pos addr_call draw_string, open_button_label rts draw_close_button_label: MGTK_RELAY_CALL MGTK::MoveTo, close_button_pos addr_call draw_string, close_button_label rts draw_cancel_button_label: MGTK_RELAY_CALL MGTK::MoveTo, cancel_button_pos addr_call draw_string, cancel_button_label rts draw_change_drive_button_label: MGTK_RELAY_CALL MGTK::MoveTo, change_drive_button_pos addr_call draw_string, change_drive_button_label rts ;;; ============================================================ .proc copy_string_to_lcbuf ptr := $06 stax ptr ldy #0 lda (ptr),y tay : lda (ptr),y sta temp_string_buf,y dey bpl :- ldax #temp_string_buf rts .endproc ;;; ============================================================ .proc draw_string jsr copy_string_to_lcbuf stax $06 ldy #$00 lda ($06),y sta $08 inc16 $06 MGTK_RELAY_CALL MGTK::DrawText, $06 rts .endproc ;;; ============================================================ .proc L5E0A jsr copy_string_to_lcbuf stax $06 ldy #$00 lda ($06),y sta $08 inc16 $06 MGTK_RELAY_CALL MGTK::TextWidth, $06 lsr16 $09 lda #$01 sta L5E56 lda #$F4 lsr L5E56 ror a sec sbc $09 sta pos_D90B lda L5E56 sbc $0A sta pos_D90B+1 MGTK_RELAY_CALL MGTK::MoveTo, pos_D90B MGTK_RELAY_CALL MGTK::DrawText, $06 rts L5E56: .byte 0 .endproc ;;; ============================================================ L5E57: jsr copy_string_to_lcbuf stax $06 MGTK_RELAY_CALL MGTK::MoveTo, common_input1_label_pos ldax $06 jsr draw_string rts ;;; ============================================================ L5E6F: jsr copy_string_to_lcbuf stax $06 MGTK_RELAY_CALL MGTK::MoveTo, common_input2_label_pos ldax $06 jsr draw_string rts ;;; ============================================================ .proc device_on_line : ldx device_num lda DEVLST,x and #$F0 sta on_line_params::unit_num yax_call MLI_RELAY, ON_LINE, on_line_params lda on_line_buffer and #$0F sta on_line_buffer bne found jsr inc_device_num jmp :- found: lda #0 sta path_buf addr_call L5F0D, on_line_buffer rts .endproc ;;; ============================================================ .proc inc_device_num inc device_num lda device_num cmp DEVCNT beq :+ bcc :+ lda #0 sta device_num : rts .endproc ;;; ============================================================ L5ECB: lda #$00 sta L5F0C L5ED0: yax_call MLI_RELAY, OPEN, open_params beq L5EE9 jsr device_on_line lda #$FF sta LD920 sta L5F0C jmp L5ED0 L5EE9: lda open_params::ref_num sta read_params::ref_num sta close_params::ref_num yax_call MLI_RELAY, READ, read_params beq L5F0B jsr device_on_line lda #$FF sta LD920 sta L5F0C jmp L5ED0 L5F0B: rts L5F0C: .byte 0 L5F0D: jsr copy_string_to_lcbuf stax $06 ldx path_buf lda #'/' sta path_buf+1,x inc path_buf ldy #0 lda ($06),y tay clc adc path_buf cmp #'A' bcc L5F2F return #$FF L5F2F: pha tax L5F31: lda ($06),y sta path_buf,x dey dex cpx path_buf bne L5F31 pla sta path_buf lda #$FF sta LD920 return #$00 ;;; ============================================================ L5F49: ldx path_buf cpx #$00 beq L5F5A dec path_buf lda path_buf,x cmp #'/' bne L5F49 L5F5A: rts ;;; ============================================================ L5F5B: jsr L5ECB lda #$00 sta L6067 sta L6068 sta L50A9 lda #$01 sta L6069 copy16 $1423, L606A lda $1425 and #$7F sta $177F bne L5F87 jmp L6012 L5F87: copy16 #$142B, $06 L5F8F: ldy #$00 lda ($06),y and #$0F bne L5F9A jmp L6007 L5F9A: ldx L6067 txa sta $1780,x ldy #$00 lda ($06),y and #$F0 cmp #$D0 beq L5FB6 bit L50A8 bpl L5FC1 inc L6068 jmp L6007 L5FB6: lda $1780,x ora #$80 sta $1780,x inc L50A9 L5FC1: ldy #$00 lda ($06),y and #$0F sta ($06),y copy16 #$1800, $08 lda #$00 sta L606C lda L6067 asl a rol L606C asl a rol L606C asl a rol L606C asl a rol L606C clc adc $08 sta $08 lda L606C adc $09 sta $09 ldy #$00 lda ($06),y tay L5FFA: lda ($06),y sta ($08),y dey bpl L5FFA inc L6067 inc L6068 L6007: inc L6069 lda L6068 cmp $177F bne L6035 L6012: yax_call MLI_RELAY, CLOSE, close_params bit L50A8 bpl L6026 lda L50A9 sta $177F L6026: jsr L62DE jsr L64E2 lda L5F0C bpl L6033 sec rts L6033: clc rts L6035: lda L6069 cmp L606B beq L604E lda $06 clc adc L606A sta $06 lda $07 adc #$00 sta $07 jmp L5F8F L604E: yax_call MLI_RELAY, READ, read_params copy16 #$1404, $06 lda #$00 sta L6069 jmp L5F8F L6067: .byte 0 L6068: .byte 0 L6069: .byte 0 L606A: .byte 0 L606B: .byte 0 L606C: .byte 0 ;;; ============================================================ L606D: lda winfo_entrydlg_file_picker jsr set_port_for_window MGTK_RELAY_CALL MGTK::PaintRect, winfo_entrydlg_file_picker::cliprect lda #$10 sta picker_entry_pos lda #$08 sta picker_entry_pos+2 lda #$00 sta picker_entry_pos+3 sta L6128 L608E: lda L6128 cmp $177F bne L60A9 MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 rts L60A9: MGTK_RELAY_CALL MGTK::MoveTo, picker_entry_pos ldx L6128 lda $1780,x and #$7F ldx #$00 stx L6127 asl a rol L6127 asl a rol L6127 asl a rol L6127 asl a rol L6127 clc adc #$00 tay lda L6127 adc #$18 tax tya jsr draw_string ldx L6128 lda $1780,x bpl L60FF lda #$01 sta picker_entry_pos MGTK_RELAY_CALL MGTK::MoveTo, picker_entry_pos addr_call draw_string, str_folder lda #$10 sta picker_entry_pos L60FF: lda L6128 cmp LD920 bne L6110 jsr L6274 lda winfo_entrydlg_file_picker jsr set_port_for_window L6110: inc L6128 add16 picker_entry_pos+2, #8, picker_entry_pos+2 jmp L608E L6127: .byte 0 L6128: .byte 0 ;;; ============================================================ .proc adjust_filename_case ptr := $A stx ptr+1 sta ptr ldy #0 lda (ptr),y tay bne loop rts loop: dey beq done bpl :+ done: rts : lda (ptr),y and #CHAR_MASK ; convert to ASCII cmp #'/' beq next cmp #'.' bne check_alpha next: dey jmp loop check_alpha: iny lda (ptr),y and #CHAR_MASK cmp #'A' bcc :+ cmp #'Z'+1 bcs :+ clc adc #('a' - 'A') ; convert to lower case sta (ptr),y : dey jmp loop .endproc ;;; ============================================================ L6161: lda #$00 L6163: sta L61B0 lda $177F cmp #$0A bcs L6181 lda #MGTK::Ctl::vertical_scroll_bar sta activatectl_which_ctl lda #MGTK::activatectl_deactivate sta activatectl_activate MGTK_RELAY_CALL MGTK::ActivateCtl, activatectl_params rts L6181: lda $177F sta winfo_entrydlg_file_picker::vthumbmax .assert MGTK::Ctl::vertical_scroll_bar = MGTK::activatectl_activate, error, "need to match" lda #MGTK::Ctl::vertical_scroll_bar sta activatectl_which_ctl sta activatectl_activate MGTK_RELAY_CALL MGTK::ActivateCtl, activatectl_params lda L61B0 sta updatethumb_thumbpos jsr L6227 lda #MGTK::Ctl::vertical_scroll_bar sta updatethumb_which_ctl MGTK_RELAY_CALL MGTK::UpdateThumb, updatethumb_params rts L61B0: .byte 0 ;;; ============================================================ L61B1: lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::PaintRect, rect_D9C8 copy16 #path_buf, $06 ldy #$00 lda ($06),y sta L6226 iny L61D0: iny lda ($06),y cmp #'/' beq L61DE cpy L6226 bne L61D0 beq L61E2 L61DE: dey sty L6226 L61E2: ldy #$00 ldx #$00 L61E6: inx iny lda ($06),y sta $0220,x cpy L6226 bne L61E6 stx $0220 addr_call adjust_filename_case, $0220 MGTK_RELAY_CALL MGTK::MoveTo, disk_label_pos addr_call draw_string, disk_label addr_call draw_string, $0220 MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 rts L6226: .byte 0 ;;; ============================================================ L6227: sta L6273 clc adc #$09 cmp $177F beq L6234 bcs L623A L6234: lda L6273 jmp L624A L623A: lda $177F cmp #$0A bcs L6247 lda L6273 jmp L624A L6247: sec sbc #$09 L624A: ldx #$00 stx L6273 asl a rol L6273 asl a rol L6273 asl a rol L6273 sta winfo_entrydlg_file_picker::cliprect+2 ldx L6273 stx winfo_entrydlg_file_picker::cliprect+3 clc adc #70 sta winfo_entrydlg_file_picker::cliprect+6 lda L6273 adc #0 sta winfo_entrydlg_file_picker::cliprect+7 rts L6273: .byte 0 L6274: ldx #0 stx L62C7 asl a rol L62C7 asl a rol L62C7 asl a rol L62C7 sta rect_D90F+2 ldx L62C7 stx rect_D90F+3 clc adc #7 sta rect_D90F+6 lda L62C7 adc #0 sta rect_D90F+7 lda winfo_entrydlg_file_picker jsr set_port_for_window MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::PaintRect, rect_D90F MGTK_RELAY_CALL MGTK::InitPort, grafport3 MGTK_RELAY_CALL MGTK::SetPort, grafport3 rts L62C7: .byte 0 ;;; ============================================================ .proc set_port_for_window sta getwinport_params2::window_id MGTK_RELAY_CALL MGTK::GetWinPort, getwinport_params2 MGTK_RELAY_CALL MGTK::SetPort, grafport2 rts .endproc ;;; ============================================================ L62DE: lda #'Z' ldx #15 : sta L63C2,x dex bpl :- lda #$00 sta L63BF sta L63BE L62F0: lda L63BF cmp $177F bne L62FB jmp L6377 L62FB: lda L63BE jsr L6451 ldy #$00 lda ($06),y bmi L633D and #$0F sta L63C1 ldy #$01 L630E: lda ($06),y cmp L63C1,y beq L631A bcs L633D jmp L6322 L631A: iny cpy #$10 bne L630E jmp L633D L6322: lda L63BE sta L63C0 ldx #$0F lda #' ' L632C: sta L63C2,x dex bpl L632C ldy L63C1 L6335: lda ($06),y sta L63C1,y dey bne L6335 L633D: inc L63BE lda L63BE cmp $177F beq L634B jmp L62FB L634B: lda L63C0 jsr L6451 ldy #$00 lda ($06),y ora #$80 sta ($06),y lda #'Z' ldx #15 : sta L63C2,x dex bpl :- ldx L63BF lda L63C0 sta L63D2,x lda #$00 sta L63BE inc L63BF jmp L62F0 L6377: ldx $177F dex stx L63BF L637E: lda L63BF bpl L63AD ldx $177F beq L63AC dex L6389: lda L63D2,x tay lda $1780,y bpl L639A lda L63D2,x ora #$80 sta L63D2,x L639A: dex bpl L6389 ldx $177F beq L63AC dex L63A3: lda L63D2,x sta $1780,x dex bpl L63A3 L63AC: rts L63AD: jsr L6451 ldy #$00 lda ($06),y and #$7F sta ($06),y dec L63BF jmp L637E L63BE: .byte 0 L63BF: .byte 0 L63C0: .byte 0 L63C1: .byte 0 L63C2: .res 16, 0 L63D2: .res 127, 0 L6451: ldx #$00 stx $06 ldx #$18 stx $07 ldx #$00 stx L647B asl a rol L647B asl a rol L647B asl a rol L647B asl a rol L647B clc adc $06 sta $06 lda L647B adc $07 sta $07 rts L647B: .byte 0 ;;; ============================================================ L647C: stax $06 ldy #$01 lda ($06),y cmp #'/' bne L64DE dey lda ($06),y cmp #$02 bcc L64DE tay lda ($06),y cmp #'/' beq L64DE ldx #$00 stx L64E1 L649B: lda ($06),y cmp #'/' beq L64AB inx cpx #$10 beq L64DE dey bne L649B beq L64B3 L64AB: inc L64E1 ldx #$00 dey bne L649B L64B3: ldy #$00 lda ($06),y tay L64B8: lda ($06),y and #CHAR_MASK cmp #'.' beq L64D8 cmp #'/' bcc L64DE cmp #'9'+1 bcc L64D8 cmp #'A' bcc L64DE cmp #'Z'+1 bcc L64D8 cmp #'a' bcc L64DE cmp #'z'+1 bcs L64DE L64D8: dey bne L64B8 return #$00 L64DE: return #$FF L64E1: .byte 0 L64E2: lda $177F bne L64E8 L64E7: rts L64E8: lda #$00 sta L6515 copy16 #$1800, $06 L64F5: lda L6515 cmp $177F beq L64E7 addr_call_indirect adjust_filename_case, $06 inc L6515 lda $06 clc adc #$10 sta $06 bcc L64F5 inc $07 jmp L64F5 L6515: .byte 0 ;;; ============================================================ L6516: stax $06 ldy #$00 lda ($06),y tay L651F: lda ($06),y sta L6576,y dey bpl L651F lda #$00 sta L6575 copy16 #$1800, $06 L6534: lda L6575 cmp $177F beq L6564 ldy #$00 lda ($06),y cmp L6576 bne L6553 tay L6546: lda ($06),y cmp L6576,y bne L6553 dey bne L6546 jmp L6567 L6553: inc L6575 lda $06 clc adc #$10 sta $06 bcc L6534 inc $07 jmp L6534 L6564: return #$FF L6567: ldx $177F lda L6575 L656D: dex cmp $1780,x bne L656D txa rts L6575: .byte 0 L6576: .res 16, 0 ;;; ============================================================ L6586: bpl L658B L6588: return #$00 L658B: cmp #$09 bcc L6588 sec sbc #$08 rts ;;; ============================================================ .proc blink_f1_ip ptr := $06 lda winfo_entrydlg jsr set_port_for_window jsr calc_path_buf0_input1_endpos stax $06 copy16 common_input1_textpos+2, $08 MGTK_RELAY_CALL MGTK::MoveTo, ptr bit prompt_ip_flag bpl bg2 MGTK_RELAY_CALL MGTK::SetTextBG, textbg1 copy #$00, prompt_ip_flag beq :+ bg2: MGTK_RELAY_CALL MGTK::SetTextBG, textbg2 copy #$FF, prompt_ip_flag : copy16 #str_insertion_point+1, ptr lda str_insertion_point sta $08 MGTK_RELAY_CALL MGTK::DrawText, ptr jsr L56E3 rts .endproc ;;; ============================================================ .proc blink_f2_ip ptr := $06 lda winfo_entrydlg jsr set_port_for_window jsr calc_path_buf1_input2_endpos stax $06 copy16 common_input2_textpos+2, $08 MGTK_RELAY_CALL MGTK::MoveTo, ptr bit prompt_ip_flag bpl bg2 MGTK_RELAY_CALL MGTK::SetTextBG, textbg1 copy #$00, prompt_ip_flag jmp :+ bg2: MGTK_RELAY_CALL MGTK::SetTextBG, textbg2 copy #$FF, prompt_ip_flag : copy16 #str_insertion_point+1, ptr lda str_insertion_point sta $08 MGTK_RELAY_CALL MGTK::DrawText, ptr jsr L56E3 rts .endproc ;;; ============================================================ .proc redraw_f1 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::PaintRect, common_input1_rect MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::FrameRect, common_input1_rect MGTK_RELAY_CALL MGTK::MoveTo, common_input1_textpos lda path_buf0 beq :+ addr_call draw_string, path_buf0 : addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces rts .endproc ;;; ============================================================ .proc redraw_f2 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::PaintRect, common_input2_rect MGTK_RELAY_CALL MGTK::SetPenMode, penXOR MGTK_RELAY_CALL MGTK::FrameRect, common_input2_rect MGTK_RELAY_CALL MGTK::MoveTo, common_input2_textpos lda path_buf1 beq :+ addr_call draw_string, path_buf1 : addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces rts .endproc ;;; ============================================================ .proc handle_f1_click lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_input1_rect cmp #MGTK::inrect_inside beq L6719 bit L5104 bpl L6718 MGTK_RELAY_CALL MGTK::InRect, common_input2_rect cmp #MGTK::inrect_inside bne L6718 jmp jt_handle_ok L6718: rts L6719: jsr calc_path_buf0_input1_endpos stax $06 cmp16 screentowindow_windowx, $06 bcs L672F jmp L67C4 L672F: jsr calc_path_buf0_input1_endpos stax L684D ldx path_buf2 inx lda #' ' sta path_buf2,x inc path_buf2 copy16 #path_buf2, $06 lda path_buf2 sta $08 L6751: MGTK_RELAY_CALL MGTK::TextWidth, $06 add16 $09, L684D, $09 cmp16 $09, screentowindow_windowx bcc L6783 dec $08 lda $08 cmp #$01 bne L6751 dec path_buf2 jmp L6846 L6783: lda $08 cmp path_buf2 bcc L6790 dec path_buf2 jmp handle_f1_meta_right_key L6790: ldx #$02 ldy path_buf0 iny L6796: lda path_buf2,x sta path_buf0,y cpx $08 beq L67A5 iny inx jmp L6796 L67A5: sty path_buf0 ldy #$02 ldx $08 inx L67AD: lda path_buf2,x sta path_buf2,y cpx path_buf2 beq L67BD iny inx jmp L67AD L67BD: dey sty path_buf2 jmp L6846 L67C4: copy16 #path_buf0, $06 lda path_buf0 sta $08 L67D1: MGTK_RELAY_CALL MGTK::TextWidth, $06 add16 $09, common_input1_textpos, $09 cmp16 $09, screentowindow_windowx bcc L6800 dec $08 lda $08 cmp #$01 bcs L67D1 jmp handle_f1_meta_left_key L6800: inc $08 ldy #$00 ldx $08 L6806: cpx path_buf0 beq L6816 inx iny lda path_buf0,x sta split_buf+1,y jmp L6806 L6816: iny sty split_buf ldx #$01 ldy split_buf L681F: cpx path_buf2 beq L682F inx iny lda path_buf2,x sta split_buf,y jmp L681F L682F: sty split_buf lda str_insertion_point+1 sta split_buf+1 L6838: lda split_buf,y sta path_buf2,y dey bpl L6838 lda $08 sta path_buf0 L6846: jsr jt_redraw_input jsr L6EA3 rts L684D: .word 0 .endproc ;;; ============================================================ .proc handle_f2_click lda winfo_entrydlg sta screentowindow_window_id MGTK_RELAY_CALL MGTK::ScreenToWindow, screentowindow_params lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, screentowindow_windowx MGTK_RELAY_CALL MGTK::InRect, common_input2_rect cmp #MGTK::inrect_inside beq L6890 bit L5104 bpl L688F MGTK_RELAY_CALL MGTK::InRect, common_input1_rect cmp #MGTK::inrect_inside bne L688F jmp jt_handle_cancel L688F: rts L6890: jsr calc_path_buf1_input2_endpos stax $06 cmp16 screentowindow_windowx, $06 bcs L68A6 jmp L693B L68A6: jsr calc_path_buf1_input2_endpos stax L69C4 ldx path_buf2 inx lda #' ' sta path_buf2,x inc path_buf2 copy16 #path_buf2, $06 lda path_buf2 sta $08 L68C8: MGTK_RELAY_CALL MGTK::TextWidth, $06 add16 $09, L69C4, $09 cmp16 $09, screentowindow_windowx bcc L68FA dec $08 lda $08 cmp #$01 bne L68C8 dec path_buf2 jmp L69BD L68FA: lda $08 cmp path_buf2 bcc L6907 dec path_buf2 jmp handle_f2_meta_right_key L6907: ldx #$02 ldy path_buf1 iny L690D: lda path_buf2,x sta path_buf1,y cpx $08 beq L691C iny inx jmp L690D L691C: sty path_buf1 ldy #$02 ldx $08 inx L6924: lda path_buf2,x sta path_buf2,y cpx path_buf2 beq L6934 iny inx jmp L6924 L6934: dey sty path_buf2 jmp L69BD L693B: copy16 #path_buf1, $06 lda path_buf1 sta $08 L6948: MGTK_RELAY_CALL MGTK::TextWidth, $06 add16 $09, common_input2_textpos, $09 cmp16 $09, screentowindow_windowx bcc L6977 dec $08 lda $08 cmp #$01 bcs L6948 jmp handle_f2_meta_left_key L6977: inc $08 ldy #$00 ldx $08 L697D: cpx path_buf1 beq L698D inx iny lda path_buf1,x sta split_buf+1,y jmp L697D L698D: iny sty split_buf ldx #$01 ldy split_buf L6996: cpx path_buf2 beq L69A6 inx iny lda path_buf2,x sta split_buf,y jmp L6996 L69A6: sty split_buf lda str_insertion_point+1 sta split_buf+1 L69AF: lda split_buf,y sta path_buf2,y dey bpl L69AF lda $08 sta path_buf1 L69BD: jsr jt_redraw_input jsr L6E9F rts L69C4: .word 0 .endproc ;;; ============================================================ .proc handle_f1_other_key sta L6A17 lda path_buf0 clc adc path_buf2 cmp #$3F bcc L69D5 rts L69D5: lda L6A17 ldx path_buf0 inx sta path_buf0,x sta str_1_char+1 jsr calc_path_buf0_input1_endpos inc path_buf0 stax $06 copy16 common_input1_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, str_1_char addr_call draw_string, path_buf2 jsr L6EA3 rts L6A17: .byte 0 .endproc ;;; ============================================================ .proc handle_f1_delete_key lda path_buf0 bne L6A1E rts L6A1E: dec path_buf0 jsr calc_path_buf0_input1_endpos stax $06 copy16 common_input1_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6EA3 rts .endproc ;;; ============================================================ .proc handle_f1_left_key lda path_buf0 bne L6A59 rts L6A59: ldx path_buf2 cpx #$01 beq L6A6B L6A60: lda path_buf2,x sta path_buf2+1,x dex cpx #$01 bne L6A60 L6A6B: ldx path_buf0 lda path_buf0,x sta path_buf2+2 dec path_buf0 inc path_buf2 jsr calc_path_buf0_input1_endpos stax $06 copy16 common_input1_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6EA3 rts .endproc ;;; ============================================================ .proc handle_f1_right_key lda path_buf2 cmp #$02 bcs L6AB4 rts L6AB4: ldx path_buf0 inx lda path_buf2+2 sta path_buf0,x inc path_buf0 ldx path_buf2 cpx #$03 bcc L6AD6 ldx #$02 L6ACA: lda path_buf2+1,x sta path_buf2,x inx cpx path_buf2 bne L6ACA L6AD6: dec path_buf2 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, common_input1_textpos addr_call draw_string, path_buf0 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6EA3 rts .endproc ;;; ============================================================ .proc handle_f1_meta_left_key lda path_buf0 bne L6B07 rts L6B07: ldy path_buf0 lda path_buf2 cmp #$02 bcc L6B20 ldx #$01 L6B13: iny inx lda path_buf2,x sta path_buf0,y cpx path_buf2 bne L6B13 L6B20: sty path_buf0 L6B23: lda path_buf0,y sta path_buf2+1,y dey bne L6B23 ldx path_buf0 inx stx path_buf2 lda #GLYPH_INSPT sta path_buf2+1 lda #$00 sta path_buf0 jsr jt_redraw_input jsr L6EA3 rts .endproc ;;; ============================================================ .proc handle_f1_meta_right_key lda path_buf2 cmp #$02 bcs L6B4C rts L6B4C: ldx #$01 ldy path_buf0 L6B51: inx iny lda path_buf2,x sta path_buf0,y cpx path_buf2 bne L6B51 sty path_buf0 copy #1, path_buf2 copy #GLYPH_INSPT, path_buf2+1 jsr jt_redraw_input jsr L6EA3 rts .endproc ;;; ============================================================ .proc handle_f2_other_key sta L6BC3 lda path_buf1 clc adc path_buf2 cmp #$3F bcc L6B81 rts L6B81: lda L6BC3 ldx path_buf1 inx sta path_buf1,x sta str_1_char+1 jsr calc_path_buf1_input2_endpos inc path_buf1 stax $06 copy16 common_input2_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, str_1_char addr_call draw_string, path_buf2 jsr L6E9F rts L6BC3: .byte 0 .endproc ;;; ============================================================ .proc handle_f2_delete_key lda path_buf1 bne L6BCA rts L6BCA: dec path_buf1 jsr calc_path_buf1_input2_endpos stax $06 copy16 common_input2_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6E9F rts .endproc ;;; ============================================================ .proc handle_f2_left_key lda path_buf1 bne L6C05 rts L6C05: ldx path_buf2 cpx #$01 beq L6C17 L6C0C: lda path_buf2,x sta path_buf2+1,x dex cpx #$01 bne L6C0C L6C17: ldx path_buf1 lda path_buf1,x sta path_buf2+2 dec path_buf1 inc path_buf2 jsr calc_path_buf1_input2_endpos stax $06 copy16 common_input2_textpos+2, $08 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, $06 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6E9F rts .endproc ;;; ============================================================ .proc handle_f2_right_key lda path_buf2 cmp #$02 bcs L6C60 rts L6C60: ldx path_buf1 inx lda path_buf2+2 sta path_buf1,x inc path_buf1 ldx path_buf2 cpx #$03 bcc L6C82 ldx #$02 L6C76: lda path_buf2+1,x sta path_buf2,x inx cpx path_buf2 bne L6C76 L6C82: dec path_buf2 lda winfo_entrydlg jsr set_port_for_window MGTK_RELAY_CALL MGTK::MoveTo, common_input2_textpos addr_call draw_string, path_buf1 addr_call draw_string, path_buf2 addr_call draw_string, str_2_spaces jsr L6E9F rts .endproc ;;; ============================================================ .proc handle_f2_meta_left_key lda path_buf1 bne L6CB3 rts L6CB3: ldy path_buf1 lda path_buf2 cmp #$02 bcc L6CCC ldx #$01 L6CBF: iny inx lda path_buf2,x sta path_buf1,y cpx path_buf2 bne L6CBF L6CCC: sty path_buf1 L6CCF: lda path_buf1,y sta path_buf2+1,y dey bne L6CCF ldx path_buf1 inx stx path_buf2 lda #GLYPH_INSPT sta path_buf2+1 lda #$00 sta path_buf1 jsr jt_redraw_input jsr L6E9F rts .endproc ;;; ============================================================ .proc handle_f2_meta_right_key lda path_buf2 cmp #$02 bcs L6CF8 rts L6CF8: ldx #$01 ldy path_buf1 L6CFD: inx iny lda path_buf2,x sta path_buf1,y cpx path_buf2 bne L6CFD sty path_buf1 copy #1, path_buf2 copy #GLYPH_INSPT, path_buf2+1 jsr jt_redraw_input jsr L6E9F rts .endproc ;;; ============================================================ ;;; Dynamically altered table of handlers for focused ;;; input field (e.g. source/destination filename, etc) jump_table: jt_handle_ok: jmp 0 jt_handle_cancel: jmp 0 jt_blink_ip: jmp 0 jt_redraw_input: jmp 0 jt_strip_path_segment: jmp 0 jt_05: jmp 0 jt_prep_path: jmp 0 jt_handle_other_key: jmp 0 jt_handle_delete_key: jmp 0 jt_handle_left_key: jmp 0 jt_handle_right_key: jmp 0 jt_handle_meta_left_key: jmp 0 jt_handle_meta_right_key: jmp 0 jt_handle_click: jmp 0 ;;; ============================================================ .proc append_to_path_buf0 ptr := $06 stax ptr ldx path_buf0 lda #'/' sta path_buf0+1,x inc path_buf0 ldy #0 lda (ptr),y tay clc adc path_buf0 pha tax : lda (ptr),y sta path_buf0,x dey dex cpx path_buf0 bne :- pla sta path_buf0 rts .endproc ;;; ============================================================ .proc append_to_path_buf1 ptr := $06 stax ptr ldx path_buf1 lda #'/' sta path_buf1+1,x inc path_buf1 ldy #$00 lda (ptr),y tay clc adc path_buf1 pha tax : lda (ptr),y sta path_buf1,x dey dex cpx path_buf1 bne :- pla sta path_buf1 rts .endproc ;;; ============================================================ .proc strip_path_buf0_segment : ldx path_buf0 cpx #0 beq :+ dec path_buf0 lda path_buf0,x cmp #'/' bne :- : rts .endproc ;;; ============================================================ .proc strip_path_buf1_segment : ldx path_buf1 cpx #0 beq :+ dec path_buf1 lda path_buf1,x cmp #'/' bne :- : rts .endproc ;;; ============================================================ .proc strip_f1_path_segment jsr strip_path_buf0_segment jsr jt_redraw_input rts .endproc ;;; ============================================================ .proc strip_f2_path_segment jsr strip_path_buf1_segment jsr jt_redraw_input rts .endproc ;;; ============================================================ jt_handle_f1_tbd05: lda #$00 beq L6DD6 jt_handle_f2_tbd05: lda #$80 .proc L6DD6 ptr := $06 sta flag copy16 #$1800, ptr ldx LD920 lda $1780,x and #$7F ldx #0 stx hi asl a ; * 16 rol hi asl a rol hi asl a rol hi asl a rol hi clc adc ptr tay lda hi adc ptr+1 tax tya bit flag bpl f1 jsr append_to_path_buf1 jmp :+ f1: jsr append_to_path_buf0 : jsr jt_redraw_input rts hi: .byte 0 ; high byte flag: .byte 0 .endproc ;;; ============================================================ .proc prep_path_buf0 COPY_STRING path_buf, path_buf0 addr_call adjust_filename_case, path_buf0 rts .endproc ;;; ============================================================ .proc prep_path_buf1 COPY_STRING path_buf, path_buf1 addr_call adjust_filename_case, path_buf1 rts .endproc ;;; ============================================================ .proc calc_path_buf0_input1_endpos str := $6 str_data := $6 str_len := $8 str_width := $9 lda #0 sta str_width sta str_width+1 lda path_buf0 beq :+ sta str_len copy16 #path_buf0+1, str_data MGTK_RELAY_CALL MGTK::TextWidth, str : lda str_width clc adc common_input1_textpos tay lda str_width+1 adc common_input1_textpos+1 tax tya rts .endproc ;;; ============================================================ .proc calc_path_buf1_input2_endpos str := $6 str_data := $6 str_len := $8 str_width := $9 lda #0 sta str_width sta str_width+1 lda path_buf1 beq :+ sta str_len copy16 #path_buf1+1, str_data MGTK_RELAY_CALL MGTK::TextWidth, str : lda str_width clc adc common_input2_textpos tay lda str_width+1 adc common_input2_textpos+1 tax tya rts .endproc ;;; ============================================================ L6E9F: lda #$FF bmi L6EA5 L6EA3: lda #$00 L6EA5: bmi L6EB6 ldx path_buf0 L6EAA: lda path_buf0,x sta split_buf,x dex bpl L6EAA jmp L6EC2 L6EB6: ldx path_buf1 L6EB9: lda path_buf1,x sta split_buf,x dex bpl L6EB9 L6EC2: lda LD920 sta L6F3D bmi L6EFB ldx #$00 stx $06 ldx #$18 stx $07 ldx #$00 stx L6F3C tax lda $1780,x and #$7F asl a rol L6F3C asl a rol L6F3C asl a rol L6F3C asl a rol L6F3C clc adc $06 tay lda L6F3C adc $07 tax tya jsr L5F0D L6EFB: addr_call adjust_filename_case, split_buf addr_call adjust_filename_case, path_buf lda split_buf cmp path_buf bne L6F26 tax L6F12: lda split_buf,x cmp path_buf,x bne L6F26 dex bne L6F12 lda #$00 sta LD8F0 jsr L6F2F rts L6F26: lda #$FF sta LD8F0 jsr L6F2F rts L6F2F: lda L6F3D sta LD920 bpl L6F38 rts L6F38: jsr L5F49 rts L6F3C: .byte 0 L6F3D: .byte 0 ;;; ============================================================ PAD_TO $7000 .endproc ; common_overlay