mirror of
https://github.com/a2-4am/4live.git
synced 2024-09-27 02:55:02 +00:00
switch to key-dispatch table, add line highlighting
dispatch table by key allows more keys without causing near-branch issues; line highlighting has "smart" II+ cursor that flashes over inverse space also shrink loader a bit
This commit is contained in:
parent
5e33176d29
commit
1606caf407
436
src/4live.a
436
src/4live.a
@ -10,7 +10,7 @@
|
|||||||
HOTKEY = $80 ; CTRL-@
|
HOTKEY = $80 ; CTRL-@
|
||||||
IMPORTKEY = $89 ; CTRL-I
|
IMPORTKEY = $89 ; CTRL-I
|
||||||
CLEARKEY = $8E ; CTRL-N
|
CLEARKEY = $8E ; CTRL-N
|
||||||
SAVEKEY = $93 ; CTRL-S
|
HIGHLIGHTKEY = $94 ; CTRL-T
|
||||||
|
|
||||||
;
|
;
|
||||||
!addr KSWL = $38
|
!addr KSWL = $38
|
||||||
@ -45,12 +45,13 @@
|
|||||||
;constants
|
;constants
|
||||||
A2E = $06
|
A2E = $06
|
||||||
INVSPACE = $20
|
INVSPACE = $20
|
||||||
LTARROW = $88
|
LTARROW = $88 ; CTRL-H
|
||||||
DNARROW = $8A
|
DNARROW = $8A ; CTRL-J
|
||||||
UPARROW = $8B
|
UPARROW = $8B ; CTRL-K
|
||||||
RETURN = $8D
|
RETURN = $8D ; CTRL-M
|
||||||
RTARROW = $95
|
RTARROW = $95 ; CTRL-U
|
||||||
ESC = $9B
|
ESC = $9B
|
||||||
|
SPACE = $A0
|
||||||
DELETE = $FF
|
DELETE = $FF
|
||||||
|
|
||||||
IOBSLOT = 1
|
IOBSLOT = 1
|
||||||
@ -66,7 +67,7 @@
|
|||||||
POSREADRANGE = 4
|
POSREADRANGE = 4
|
||||||
WIDTH = 40
|
WIDTH = 40
|
||||||
HEIGHT = 24
|
HEIGHT = 24
|
||||||
LDRBASE = $2d9
|
LDRBASE = $2ee
|
||||||
INSTALLBUFFER = $249 ; yes, the overlay overwrites the loader...
|
INSTALLBUFFER = $249 ; yes, the overlay overwrites the loader...
|
||||||
SWAPBUFFER = $900 ; (LoadSaveEnd - LoadSaveStart) size
|
SWAPBUFFER = $900 ; (LoadSaveEnd - LoadSaveStart) size
|
||||||
; needed by DiversiDOS, must be page-aligned
|
; needed by DiversiDOS, must be page-aligned
|
||||||
@ -167,6 +168,7 @@ FileName
|
|||||||
!text "4s" ;self-modified
|
!text "4s" ;self-modified
|
||||||
OpenMLI_e
|
OpenMLI_e
|
||||||
|
|
||||||
|
ReuseRts
|
||||||
rts
|
rts
|
||||||
|
|
||||||
FileName_b
|
FileName_b
|
||||||
@ -217,34 +219,8 @@ SwapFILEMAN
|
|||||||
BankInRAM1
|
BankInRAM1
|
||||||
bit LCBANK1
|
bit LCBANK1
|
||||||
bit LCBANK1
|
bit LCBANK1
|
||||||
|
|
||||||
ReuseRts
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
;support enhanced flashing cursor while waiting for key, if available.
|
|
||||||
;it works by passing to the routine the character under the cursor.
|
|
||||||
;the ROM toggles between that character and the Delete character.
|
|
||||||
;on an Apple II+, the cursor is an inverse space in DOS mode.
|
|
||||||
;our cursor flashes.
|
|
||||||
|
|
||||||
GlobalKeyboardHook
|
|
||||||
jsr KEYIN
|
|
||||||
|
|
||||||
GetKey
|
|
||||||
;are we on?
|
|
||||||
cmp #HOTKEY
|
|
||||||
|
|
||||||
;no -> return to DOS
|
|
||||||
bne ReuseRts
|
|
||||||
|
|
||||||
jsr BankInRAM1
|
|
||||||
jsr RunFromBankedRAM
|
|
||||||
lda ROMIN1
|
|
||||||
|
|
||||||
;lather, rinse, repeat
|
|
||||||
jsr RDCHAR ;returns non-zero
|
|
||||||
bne GetKey
|
|
||||||
|
|
||||||
ReadFile
|
ReadFile
|
||||||
WriteFile
|
WriteFile
|
||||||
jsr ExchangeSwapBanked1
|
jsr ExchangeSwapBanked1
|
||||||
@ -413,6 +389,30 @@ ExchangeSwapBanked2
|
|||||||
|
|
||||||
_WelcomeMessage
|
_WelcomeMessage
|
||||||
!text $8D, "4LIVE ready. Press Ctrl+", HOTKEY + $40, " to activate.", $8D, 0
|
!text $8D, "4LIVE ready. Press Ctrl+", HOTKEY + $40, " to activate.", $8D, 0
|
||||||
|
|
||||||
|
;support enhanced flashing cursor while waiting for key, if available.
|
||||||
|
;it works by passing to the routine the character under the cursor.
|
||||||
|
;the ROM toggles between that character and the Delete character.
|
||||||
|
;on an Apple II+, the cursor is an inverse space in DOS mode.
|
||||||
|
;our cursor flashes.
|
||||||
|
|
||||||
|
GlobalKeyboardHook
|
||||||
|
jsr KEYIN
|
||||||
|
|
||||||
|
GetKey
|
||||||
|
;are we on?
|
||||||
|
cmp #HOTKEY
|
||||||
|
|
||||||
|
;no -> return to DOS
|
||||||
|
bne ReuseRts
|
||||||
|
|
||||||
|
jsr BankInRAM1
|
||||||
|
jsr RunFromBankedRAM
|
||||||
|
lda ROMIN1
|
||||||
|
|
||||||
|
;lather, rinse, repeat
|
||||||
|
jsr RDCHAR ;returns non-zero
|
||||||
|
bne GetKey ;always
|
||||||
}
|
}
|
||||||
InstallEnd
|
InstallEnd
|
||||||
!if >(InstallEnd - InstallStart) {
|
!if >(InstallEnd - InstallStart) {
|
||||||
@ -533,12 +533,6 @@ SetScrollLines
|
|||||||
sta SCROLLLINE
|
sta SCROLLLINE
|
||||||
rts
|
rts
|
||||||
|
|
||||||
ScrollParms1
|
|
||||||
!word LastLine, LastLine - WIDTH
|
|
||||||
|
|
||||||
ScrollParms2
|
|
||||||
!word FirstLine, FirstLine + WIDTH
|
|
||||||
|
|
||||||
UpdateVirtualOff
|
UpdateVirtualOff
|
||||||
;set up copy addresses for next line
|
;set up copy addresses for next line
|
||||||
|
|
||||||
@ -612,164 +606,6 @@ MyWAIT
|
|||||||
bne --
|
bne --
|
||||||
rts
|
rts
|
||||||
|
|
||||||
ClearScreen ; does not clear status line
|
|
||||||
pha
|
|
||||||
clc
|
|
||||||
|
|
||||||
HandleKeyImportScreen ;called with carry set
|
|
||||||
lda #<(LastLine - WIDTH)
|
|
||||||
sta OPSRC1L
|
|
||||||
lda #>(LastLine - WIDTH)
|
|
||||||
sta OPSRC1H
|
|
||||||
|
|
||||||
ldx #(HEIGHT - 2)
|
|
||||||
-- jsr SetTextCalc
|
|
||||||
ldy #(WIDTH - 1)
|
|
||||||
lda #$A0
|
|
||||||
- bcc + ;ClearScreen path
|
|
||||||
lda (OPSRC1L), y
|
|
||||||
+ sta (OPSRC2L), y
|
|
||||||
dey
|
|
||||||
bpl -
|
|
||||||
bcc + ;ClearScreen path
|
|
||||||
sec
|
|
||||||
lda OPSRC1L
|
|
||||||
sbc #WIDTH
|
|
||||||
sta OPSRC1L
|
|
||||||
bcs +
|
|
||||||
dec OPSRC1H
|
|
||||||
sec
|
|
||||||
+ dex
|
|
||||||
bpl --
|
|
||||||
bcc ClearScreenRet ;ClearScreen path
|
|
||||||
|
|
||||||
;print anything that isn't a special key
|
|
||||||
;wrap around screen position when we hit edges
|
|
||||||
|
|
||||||
EditorMode
|
|
||||||
jsr MyKEYIN
|
|
||||||
cmp #HOTKEY
|
|
||||||
beq _doneEditorMode
|
|
||||||
cmp #ESC
|
|
||||||
beq _doneEditorMode
|
|
||||||
|
|
||||||
ClearOnFirstKeypress
|
|
||||||
ldx #0 ;self-modified
|
|
||||||
beq +
|
|
||||||
dec ClearOnFirstKeypress + 1
|
|
||||||
jsr ClearScreen
|
|
||||||
+
|
|
||||||
cmp #LTARROW
|
|
||||||
beq HandleKeyLineLeft
|
|
||||||
cmp #DNARROW
|
|
||||||
beq HandleKeyLineDown
|
|
||||||
cmp #UPARROW
|
|
||||||
beq HandleKeyLineUp
|
|
||||||
cmp #RTARROW
|
|
||||||
beq HandleKeyLineRight
|
|
||||||
cmp #RETURN
|
|
||||||
beq HandleKeyReturn
|
|
||||||
ldx #1
|
|
||||||
stx IsDirty + 1
|
|
||||||
cmp #IMPORTKEY
|
|
||||||
beq HandleKeyImportScreen
|
|
||||||
cmp #CLEARKEY
|
|
||||||
beq HandleKeyClearScreen
|
|
||||||
jsr MyCOUT
|
|
||||||
jmp EditorMode ;always
|
|
||||||
|
|
||||||
ClearScreenRet
|
|
||||||
pla
|
|
||||||
|
|
||||||
_doneEditorMode
|
|
||||||
rts
|
|
||||||
|
|
||||||
HandleKeyLineLeft
|
|
||||||
dec MyCH + 1
|
|
||||||
bpl EditorMode
|
|
||||||
lda #(WIDTH - 1)
|
|
||||||
|
|
||||||
SetColumn
|
|
||||||
sta MyCH + 1
|
|
||||||
bpl EditorMode ;always
|
|
||||||
|
|
||||||
HandleKeyLineRight
|
|
||||||
inc MyCH + 1
|
|
||||||
lda MyCH + 1
|
|
||||||
eor #WIDTH ;zero on match
|
|
||||||
bne EditorMode
|
|
||||||
beq SetColumn ;always
|
|
||||||
|
|
||||||
HandleKeyLineUp
|
|
||||||
ldy MyCV + 1
|
|
||||||
dey
|
|
||||||
bpl SetRow
|
|
||||||
ldy #(HEIGHT - 2)
|
|
||||||
|
|
||||||
SetRow
|
|
||||||
sty MyCV + 1
|
|
||||||
ldx MyCH + 1
|
|
||||||
jsr MyBASCALC ;returns flag=plus
|
|
||||||
bpl EditorMode ;always
|
|
||||||
|
|
||||||
HandleKeyClearScreen
|
|
||||||
jsr ClearScreen
|
|
||||||
dey ;-2
|
|
||||||
sty MyCV + 1 ;use big store to trigger wraparound
|
|
||||||
;fall through
|
|
||||||
|
|
||||||
HandleKeyReturn
|
|
||||||
lda #0
|
|
||||||
sta MyCH + 1
|
|
||||||
;fall through
|
|
||||||
|
|
||||||
HandleKeyLineDown
|
|
||||||
ldy MyCV + 1
|
|
||||||
iny
|
|
||||||
cpy #(HEIGHT - 1) ;zero on match
|
|
||||||
bcc SetRow ;not BNE to allow big store use
|
|
||||||
ldy #0
|
|
||||||
beq SetRow ;always
|
|
||||||
|
|
||||||
MyKEYIN
|
|
||||||
ldx MyCH + 1
|
|
||||||
|
|
||||||
ScreenBuff2
|
|
||||||
lda $34f3, x ;self-modified
|
|
||||||
sta ToggleChar + 1
|
|
||||||
|
|
||||||
CharDel
|
|
||||||
lda #DELETE
|
|
||||||
sec
|
|
||||||
!byte $24 ;mask CLC
|
|
||||||
ToggleCarry
|
|
||||||
clc
|
|
||||||
bcs +
|
|
||||||
|
|
||||||
ToggleChar
|
|
||||||
lda #"Q" ;self-modified
|
|
||||||
|
|
||||||
+ ldx MyCH + 1
|
|
||||||
|
|
||||||
ScreenBuff3
|
|
||||||
sta $34f3, x ;self-modified
|
|
||||||
|
|
||||||
;timing is taken from extended ROM
|
|
||||||
;code is optimised for size
|
|
||||||
|
|
||||||
ldx #$31
|
|
||||||
ldy #0
|
|
||||||
- lda KBD
|
|
||||||
bmi +
|
|
||||||
dey
|
|
||||||
bne -
|
|
||||||
dex
|
|
||||||
bne -
|
|
||||||
bcc CharDel
|
|
||||||
+ bcs ToggleCarry ;restore original character, also on exit
|
|
||||||
bit STROBE
|
|
||||||
rts
|
|
||||||
|
|
||||||
MyCOUT
|
MyCOUT
|
||||||
MyCH
|
MyCH
|
||||||
ldx #"Q" ;self-modified
|
ldx #"Q" ;self-modified
|
||||||
@ -800,6 +636,186 @@ MyBASCALC
|
|||||||
++ stx MyCH + 1
|
++ stx MyCH + 1
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
MyKEYIN
|
||||||
|
ldx MyCH + 1
|
||||||
|
|
||||||
|
ScreenBuff2
|
||||||
|
lda $34f3, x ;self-modified
|
||||||
|
sta ToggleChar + 1
|
||||||
|
|
||||||
|
;detect Apple II+ cursor sitting on inverse space
|
||||||
|
;and replace with normal space so it remains visible
|
||||||
|
;no inverse alternative for Apple IIe cursor
|
||||||
|
|
||||||
|
CharDel
|
||||||
|
ldy #DELETE ;self-modified
|
||||||
|
bmi +
|
||||||
|
cmp #INVSPACE
|
||||||
|
bne +
|
||||||
|
ldy #SPACE
|
||||||
|
+ tya
|
||||||
|
sec
|
||||||
|
!byte $24 ;mask CLC
|
||||||
|
ToggleCarry
|
||||||
|
clc
|
||||||
|
bcs +
|
||||||
|
|
||||||
|
ToggleChar
|
||||||
|
lda #"Q" ;self-modified
|
||||||
|
|
||||||
|
+ ldx MyCH + 1
|
||||||
|
|
||||||
|
ScreenBuff3
|
||||||
|
sta $34f3, x ;self-modified
|
||||||
|
|
||||||
|
;timing is taken from extended ROM
|
||||||
|
;code is optimised for size
|
||||||
|
|
||||||
|
ldx #$31
|
||||||
|
ldy #0
|
||||||
|
- bit KBD
|
||||||
|
bmi +
|
||||||
|
dey
|
||||||
|
bne -
|
||||||
|
dex
|
||||||
|
bne -
|
||||||
|
bcc CharDel
|
||||||
|
+ bcs ToggleCarry ;restore original character, also on exit
|
||||||
|
lda KBD
|
||||||
|
bit STROBE
|
||||||
|
rts
|
||||||
|
|
||||||
|
;print anything that isn't a special key
|
||||||
|
;wrap around screen position when we hit edges
|
||||||
|
|
||||||
|
EditorMode
|
||||||
|
jsr MyKEYIN
|
||||||
|
ldx #(KeyTable_e - KeyTable_b)
|
||||||
|
- ldy DispatchTableLow, x
|
||||||
|
sty DispatchCommand + 1
|
||||||
|
ldy DispatchTableHigh, x
|
||||||
|
sty DispatchCommand + 2
|
||||||
|
dex
|
||||||
|
bmi SetDirty
|
||||||
|
cmp KeyTable_b, x
|
||||||
|
bne -
|
||||||
|
cpx #(IgnoreClear - KeyTable_b)
|
||||||
|
bcc DispatchCommand
|
||||||
|
cpx #(IgnoreDirty - KeyTable_b)
|
||||||
|
|
||||||
|
ClearOnFirstKeypress
|
||||||
|
ldy #0 ;self-modified
|
||||||
|
beq +
|
||||||
|
dec ClearOnFirstKeypress + 1
|
||||||
|
php
|
||||||
|
jsr ClearScreen ;preserves A
|
||||||
|
plp
|
||||||
|
+ bcc DispatchCommand
|
||||||
|
|
||||||
|
SetDirty
|
||||||
|
sta IsDirty + 1
|
||||||
|
|
||||||
|
DispatchCommand
|
||||||
|
jsr EditorMode ;self-modified, one or both bytes depending on routine placement
|
||||||
|
jmp EditorMode
|
||||||
|
|
||||||
|
_doneEditorMode
|
||||||
|
pla
|
||||||
|
pla
|
||||||
|
|
||||||
|
DispatchReturn
|
||||||
|
rts
|
||||||
|
|
||||||
|
HandleKeyLineLeft
|
||||||
|
dec MyCH + 1
|
||||||
|
bpl DispatchReturn
|
||||||
|
lda #(WIDTH - 1)
|
||||||
|
|
||||||
|
SetColumn
|
||||||
|
sta MyCH + 1
|
||||||
|
bpl DispatchReturn ;always
|
||||||
|
|
||||||
|
HandleKeyLineRight
|
||||||
|
inc MyCH + 1
|
||||||
|
lda MyCH + 1
|
||||||
|
eor #WIDTH ;zero on match
|
||||||
|
bne DispatchReturn
|
||||||
|
beq SetColumn ;always
|
||||||
|
|
||||||
|
HandleKeyLineUp
|
||||||
|
ldy MyCV + 1
|
||||||
|
dey
|
||||||
|
bpl SetRow
|
||||||
|
ldy #(HEIGHT - 2)
|
||||||
|
|
||||||
|
SetRow
|
||||||
|
sty MyCV + 1
|
||||||
|
ldx MyCH + 1
|
||||||
|
jmp MyBASCALC
|
||||||
|
|
||||||
|
HandleKeyClearScreen
|
||||||
|
jsr ClearScreen
|
||||||
|
dey ;-2
|
||||||
|
sty MyCV + 1 ;use big store to trigger wraparound
|
||||||
|
;fall through
|
||||||
|
|
||||||
|
HandleKeyReturn
|
||||||
|
lda #0
|
||||||
|
sta MyCH + 1
|
||||||
|
;fall through
|
||||||
|
|
||||||
|
HandleKeyLineDown
|
||||||
|
ldy MyCV + 1
|
||||||
|
iny
|
||||||
|
cpy #(HEIGHT - 1) ;zero on match
|
||||||
|
bcc SetRow ;not BNE to allow big store use
|
||||||
|
ldy #0
|
||||||
|
beq SetRow ;always
|
||||||
|
|
||||||
|
ClearScreen ; does not clear status line
|
||||||
|
pha
|
||||||
|
clc
|
||||||
|
|
||||||
|
HandleKeyImportScreen ;called with carry set
|
||||||
|
lda #<(LastLine - WIDTH)
|
||||||
|
sta OPSRC1L
|
||||||
|
lda #>(LastLine - WIDTH)
|
||||||
|
sta OPSRC1H
|
||||||
|
|
||||||
|
ldx #(HEIGHT - 2)
|
||||||
|
-- jsr SetTextCalc
|
||||||
|
ldy #(WIDTH - 1)
|
||||||
|
lda #$A0
|
||||||
|
- bcc + ;ClearScreen path
|
||||||
|
lda (OPSRC1L), y
|
||||||
|
+ sta (OPSRC2L), y
|
||||||
|
dey
|
||||||
|
bpl -
|
||||||
|
bcc + ;ClearScreen path
|
||||||
|
sec
|
||||||
|
lda OPSRC1L
|
||||||
|
sbc #WIDTH
|
||||||
|
sta OPSRC1L
|
||||||
|
bcs +
|
||||||
|
dec OPSRC1H
|
||||||
|
sec
|
||||||
|
+ dex
|
||||||
|
bpl --
|
||||||
|
bcs + ;ImportScreen path
|
||||||
|
pla
|
||||||
|
+ rts
|
||||||
|
|
||||||
|
HandleKeyHighlight
|
||||||
|
ldx MyCV + 1
|
||||||
|
jsr SetTextCalc
|
||||||
|
ldy #(WIDTH - 1)
|
||||||
|
- lda (OPSRC2L), y
|
||||||
|
eor #$80
|
||||||
|
sta (OPSRC2L), y
|
||||||
|
dey
|
||||||
|
bpl -
|
||||||
|
rts
|
||||||
|
|
||||||
SaveFile
|
SaveFile
|
||||||
lda MyCH + 1
|
lda MyCH + 1
|
||||||
sta SaveCH
|
sta SaveCH
|
||||||
@ -828,6 +844,32 @@ TextCalcLo
|
|||||||
!byte $28, $A8, $28, $A8, $28, $A8, $28, $A8
|
!byte $28, $A8, $28, $A8, $28, $A8, $28, $A8
|
||||||
!byte $50, $D0, $50, $D0, $50, $D0, $50, $D0
|
!byte $50, $D0, $50, $D0, $50, $D0, $50, $D0
|
||||||
|
|
||||||
|
ScrollParms1
|
||||||
|
!word LastLine, LastLine - WIDTH
|
||||||
|
|
||||||
|
ScrollParms2
|
||||||
|
!word FirstLine, FirstLine + WIDTH
|
||||||
|
|
||||||
|
KeyTable_b
|
||||||
|
!byte HOTKEY, ESC
|
||||||
|
IgnoreClear
|
||||||
|
!byte LTARROW, DNARROW, UPARROW, RTARROW, RETURN
|
||||||
|
IgnoreDirty
|
||||||
|
!byte IMPORTKEY, CLEARKEY, HIGHLIGHTKEY
|
||||||
|
KeyTable_e
|
||||||
|
|
||||||
|
DispatchTableLow
|
||||||
|
!byte <MyCOUT
|
||||||
|
!byte <_doneEditorMode, <_doneEditorMode
|
||||||
|
!byte <HandleKeyLineLeft, <HandleKeyLineDown, <HandleKeyLineUp, <HandleKeyLineRight, <HandleKeyReturn
|
||||||
|
!byte <HandleKeyImportScreen, <HandleKeyClearScreen, <HandleKeyHighlight
|
||||||
|
|
||||||
|
DispatchTableHigh
|
||||||
|
!byte >MyCOUT
|
||||||
|
!byte >_doneEditorMode, >_doneEditorMode
|
||||||
|
!byte >HandleKeyLineLeft, >HandleKeyLineDown, >HandleKeyLineUp, >HandleKeyLineRight, >HandleKeyReturn
|
||||||
|
!byte >HandleKeyImportScreen, >HandleKeyClearScreen, >HandleKeyHighlight
|
||||||
|
|
||||||
LoadSaveStart
|
LoadSaveStart
|
||||||
SaveCH
|
SaveCH
|
||||||
!byte 0 ;loaded from file if exists
|
!byte 0 ;loaded from file if exists
|
||||||
|
Loading…
Reference in New Issue
Block a user