From 4b4b323dc1d2b3f2255ac4b7c4331c053258498b Mon Sep 17 00:00:00 2001 From: Dave Lyons Date: Sat, 22 Aug 2020 00:17:34 -0700 Subject: [PATCH] Command line editing: * On a GS, Control-U cancels the entire line like Control-X. (Right-arrow is Control-U, but without the Control key down.) * On a GS, Control-K clears to end-of-line like Control-Y. (Up-arrow is Control-K, but without the Control key down.) * Insert mode is on by default. --- src/shell/2/davex_io.asm | 48 ++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/shell/2/davex_io.asm b/src/shell/2/davex_io.asm index 8deadb6..b3e58e5 100644 --- a/src/shell/2/davex_io.asm +++ b/src/shell/2/davex_io.asm @@ -27,6 +27,7 @@ rc_spch: x98: jmp (ksw) rdchar2: + lsr ControlKeyDown bit speech bmi rc_spch jmp (ksw) @@ -95,7 +96,8 @@ rc_l1: lda keyboard jsr poll_inslot bcs rc_l1 bcc h_key2 -h_key: sta kbdstrb +h_key: jsr CaptureModifierState + sta kbdstrb h_key2: sta theKey pla sta invflg @@ -104,6 +106,22 @@ h_key2: sta theKey jsr pr_bs lda theKey rts + +CaptureModifierState: + pha +; If running on an Apple IIgs, check the Control key in the modifiers register. + lda xc_req + and #8 + beq @notGS + lda $c025 ;bit 1 (value $02) = Control down + lsr a + lsr a ; into Carry flag + ror ControlKeyDown +@notGS: pla + rts + +ControlKeyDown: + .byte 0 ; bit 7 set if Control was down on last keypress theKey: .byte 0 vcout: jmp (vid_csw) ; @@ -347,8 +365,8 @@ mygetln2: sta exec_flag ;bit 7 ldx #0 stx longest - stx insert_mode lda #<-1 + sta insert_mode ; insert mode is on by default sta hist_level mg_l1: ldy longest lda #space @@ -471,11 +489,11 @@ mgdispatch: .addr ctrlr-1 .addr mg_err-1 ;s .addr mg_err-1 ;t - .addr ctrlu-1 + .addr ctrlu-1 ;u = right arrow .addr mg_err-1 ;v .addr mg_err-1 ;w .addr ctrlx-1 - .addr ctrly-1 ;y + .addr ctrly-1 ;y - erase remainder of line .addr mg_err-1 ;z .addr ctrlx-1 ;esc = ctrlx (for new //e kbd "clear") .addr mg_err-1 ;ctrl-backslash @@ -513,7 +531,7 @@ tglInsert: sta insert_mode jmp mg_l1 ;********************** -ctrly: stx xsave ;truncate cmd lin at cursor +ctrly: stx xsave ;truncate cmd line at cursor yblanks: jsr pr_sp @@ -578,7 +596,6 @@ f_cont: pha jmp mgfind_l1 ctrlh: ;backspace - lsr insert_mode cpx #0 bne bs_ok jmp mg_err @@ -596,7 +613,6 @@ ctrli: sec jmp mg_l1 ctrlx: - lsr insert_mode jsr mg_can sec rts @@ -607,7 +623,6 @@ mg_can: jsr backx jsr backx ldx #0 stx longest - lsr insert_mode rts mgdelete: @@ -658,11 +673,14 @@ ctrlj: ;down arrow bmi ctrlk jmp ctrlr -ctrlk: ;up arrow - inc hist_level +ctrlk: ;up arrow or Control-K + bit ControlKeyDown + bpl :+ + jmp ctrly +: inc hist_level jmp ctrlr -ctrld: lsr insert_mode ;delete at cursor +ctrld: cpx longest bcc len_ok jmp mg_err @@ -685,9 +703,11 @@ dl_back: bne dl_back jmp mg_l1 -ctrlu: - lsr insert_mode - cpx longest +ctrlu: ; right arrow or Control-U + bit ControlKeyDown + bpl :+ + jmp ctrlx +: cpx longest ; right arrow bcc len_ok2 jmp mg_err len_ok2: