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.
This commit is contained in:
Dave Lyons
2020-08-22 00:17:34 -07:00
parent 4a930a5eb0
commit 4b4b323dc1

View File

@@ -27,6 +27,7 @@ rc_spch:
x98: jmp (ksw) x98: jmp (ksw)
rdchar2: rdchar2:
lsr ControlKeyDown
bit speech bit speech
bmi rc_spch bmi rc_spch
jmp (ksw) jmp (ksw)
@@ -95,7 +96,8 @@ rc_l1: lda keyboard
jsr poll_inslot jsr poll_inslot
bcs rc_l1 bcs rc_l1
bcc h_key2 bcc h_key2
h_key: sta kbdstrb h_key: jsr CaptureModifierState
sta kbdstrb
h_key2: sta theKey h_key2: sta theKey
pla pla
sta invflg sta invflg
@@ -104,6 +106,22 @@ h_key2: sta theKey
jsr pr_bs jsr pr_bs
lda theKey lda theKey
rts 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 theKey: .byte 0
vcout: jmp (vid_csw) vcout: jmp (vid_csw)
; ;
@@ -347,8 +365,8 @@ mygetln2:
sta exec_flag ;bit 7 sta exec_flag ;bit 7
ldx #0 ldx #0
stx longest stx longest
stx insert_mode
lda #<-1 lda #<-1
sta insert_mode ; insert mode is on by default
sta hist_level sta hist_level
mg_l1: ldy longest mg_l1: ldy longest
lda #space lda #space
@@ -471,11 +489,11 @@ mgdispatch:
.addr ctrlr-1 .addr ctrlr-1
.addr mg_err-1 ;s .addr mg_err-1 ;s
.addr mg_err-1 ;t .addr mg_err-1 ;t
.addr ctrlu-1 .addr ctrlu-1 ;u = right arrow
.addr mg_err-1 ;v .addr mg_err-1 ;v
.addr mg_err-1 ;w .addr mg_err-1 ;w
.addr ctrlx-1 .addr ctrlx-1
.addr ctrly-1 ;y .addr ctrly-1 ;y - erase remainder of line
.addr mg_err-1 ;z .addr mg_err-1 ;z
.addr ctrlx-1 ;esc = ctrlx (for new //e kbd "clear") .addr ctrlx-1 ;esc = ctrlx (for new //e kbd "clear")
.addr mg_err-1 ;ctrl-backslash .addr mg_err-1 ;ctrl-backslash
@@ -513,7 +531,7 @@ tglInsert:
sta insert_mode sta insert_mode
jmp mg_l1 jmp mg_l1
;********************** ;**********************
ctrly: stx xsave ;truncate cmd lin at cursor ctrly: stx xsave ;truncate cmd line at cursor
yblanks: yblanks:
jsr pr_sp jsr pr_sp
@@ -578,7 +596,6 @@ f_cont: pha
jmp mgfind_l1 jmp mgfind_l1
ctrlh: ;backspace ctrlh: ;backspace
lsr insert_mode
cpx #0 cpx #0
bne bs_ok bne bs_ok
jmp mg_err jmp mg_err
@@ -596,7 +613,6 @@ ctrli: sec
jmp mg_l1 jmp mg_l1
ctrlx: ctrlx:
lsr insert_mode
jsr mg_can jsr mg_can
sec sec
rts rts
@@ -607,7 +623,6 @@ mg_can: jsr backx
jsr backx jsr backx
ldx #0 ldx #0
stx longest stx longest
lsr insert_mode
rts rts
mgdelete: mgdelete:
@@ -658,11 +673,14 @@ ctrlj: ;down arrow
bmi ctrlk bmi ctrlk
jmp ctrlr jmp ctrlr
ctrlk: ;up arrow ctrlk: ;up arrow or Control-K
inc hist_level bit ControlKeyDown
bpl :+
jmp ctrly
: inc hist_level
jmp ctrlr jmp ctrlr
ctrld: lsr insert_mode ;delete at cursor ctrld:
cpx longest cpx longest
bcc len_ok bcc len_ok
jmp mg_err jmp mg_err
@@ -685,9 +703,11 @@ dl_back:
bne dl_back bne dl_back
jmp mg_l1 jmp mg_l1
ctrlu: ctrlu: ; right arrow or Control-U
lsr insert_mode bit ControlKeyDown
cpx longest bpl :+
jmp ctrlx
: cpx longest ; right arrow
bcc len_ok2 bcc len_ok2
jmp mg_err jmp mg_err
len_ok2: len_ok2: