work on character inserting
This commit is contained in:
1 parent
b03aa78f54
commit
47090a52fd
9 files changed
+63
-131
No files matched your search
@@ -4,7 +4,7 @@
|
|||||||
Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation):
|
Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation):
|
||||||
|
|
||||||
|
|
||||||
* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys
|
* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-key rollover), supports additional C128 keys
|
||||||
* joystick can be used to move text cursor
|
* joystick can be used to move text cursor
|
||||||
* pre-defined function keys
|
* pre-defined function keys
|
||||||
|
|
||||||
|
|||||||
@@ -90,8 +90,7 @@ chrin_enter:
|
|||||||
sta LXSP+1
|
sta LXSP+1
|
||||||
|
|
||||||
// Calculate length
|
// Calculate length
|
||||||
jsr screen_get_current_line_logical_length
|
jsr screen_get_logical_line_end_ptr
|
||||||
tay
|
|
||||||
iny
|
iny
|
||||||
!: dey
|
!: dey
|
||||||
bmi empty_line
|
bmi empty_line
|
||||||
|
|||||||
@@ -3,10 +3,7 @@
|
|||||||
// CHROUT routine - screen support, DEL key handling
|
// CHROUT routine - screen support, DEL key handling
|
||||||
//
|
//
|
||||||
|
|
||||||
chrout_screen_DEL:
|
|
||||||
jmp chrout_screen_done
|
|
||||||
|
|
||||||
/* YYY disabled for rework
|
|
||||||
chrout_screen_DEL:
|
chrout_screen_DEL:
|
||||||
|
|
||||||
// In insert mode it embeds control character
|
// In insert mode it embeds control character
|
||||||
@@ -14,6 +11,14 @@ chrout_screen_DEL:
|
|||||||
beq !+
|
beq !+
|
||||||
jmp chrout_screen_quote
|
jmp chrout_screen_quote
|
||||||
!:
|
!:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
jmp chrout_screen_done
|
||||||
|
|
||||||
|
/* YYY disabled for rework
|
||||||
|
chrout_screen_DEL:
|
||||||
|
|
||||||
ldx PNTR
|
ldx PNTR
|
||||||
bne chrout_screen_del_column_non_0
|
bne chrout_screen_del_column_non_0
|
||||||
|
|
||||||
|
|||||||
@@ -3,39 +3,30 @@
|
|||||||
// CHROUT routine - screen support, INS key handling
|
// CHROUT routine - screen support, INS key handling
|
||||||
//
|
//
|
||||||
|
|
||||||
chrout_screen_INS:
|
|
||||||
jmp chrout_screen_done
|
|
||||||
|
|
||||||
/* YYY disabled for rework
|
// YYY does not work properly on growing logical line
|
||||||
|
// YYY implement LNMX
|
||||||
|
|
||||||
|
|
||||||
chrout_screen_INS:
|
chrout_screen_INS:
|
||||||
|
|
||||||
// Insert (shift-DELETE)
|
// First check if last character of the line is space
|
||||||
|
|
||||||
// Abort if line already max length, ie 79th char is not a space
|
jsr screen_check_space_ends_line
|
||||||
jsr screen_get_current_line_logical_length
|
beq chrout_screen_ins_possible
|
||||||
cmp #79
|
|
||||||
bne !+
|
|
||||||
tay
|
|
||||||
lda (PNT),y
|
|
||||||
cmp #$20
|
|
||||||
beq !+
|
|
||||||
|
|
||||||
// Line is too long to extend
|
// Not space, try to grow logical line and check once again
|
||||||
jmp chrout_screen_done
|
|
||||||
|
|
||||||
!:
|
|
||||||
// Work out if line needs to be expanded, and if so expand it
|
|
||||||
ldy #39
|
|
||||||
lda (PNT),y
|
|
||||||
cmp #$20
|
|
||||||
beq !+
|
|
||||||
|
|
||||||
jsr screen_grow_logical_line
|
jsr screen_grow_logical_line
|
||||||
|
jsr screen_check_space_ends_line
|
||||||
|
bne_far chrout_screen_done
|
||||||
|
|
||||||
!:
|
// FALLTROUGH
|
||||||
// Shuffle chars towards end of line
|
|
||||||
jsr screen_get_current_line_logical_length
|
chrout_screen_ins_possible:
|
||||||
tay
|
|
||||||
|
// Move chars towards end of the line
|
||||||
|
jsr screen_get_logical_line_end_ptr
|
||||||
!:
|
!:
|
||||||
// Note: While the following routine is obvious to any skilled
|
// Note: While the following routine is obvious to any skilled
|
||||||
// in the art as the most obvious simple and efficient solution,
|
// in the art as the most obvious simple and efficient solution,
|
||||||
@@ -43,7 +34,7 @@ chrout_screen_INS:
|
|||||||
// in a relatively long verbatim stretch of bytes when compared to
|
// in a relatively long verbatim stretch of bytes when compared to
|
||||||
// the C64 KERNAL. Thus we have swapped the order, just to reduce
|
// the C64 KERNAL. Thus we have swapped the order, just to reduce
|
||||||
// the potential for any argument of copyright infringement, even
|
// the potential for any argument of copyright infringement, even
|
||||||
// though we really don't believe that the routine can be copyrighted
|
// though we really do not believe that the routine can be copyrighted
|
||||||
// due to the lack of creativity.
|
// due to the lack of creativity.
|
||||||
dey
|
dey
|
||||||
lda (USER),y
|
lda (USER),y
|
||||||
@@ -63,7 +54,6 @@ chrout_screen_INS:
|
|||||||
|
|
||||||
// Put space in the inserted gap
|
// Put space in the inserted gap
|
||||||
lda #$20
|
lda #$20
|
||||||
sta (PNT),y
|
sta (PNT), y
|
||||||
|
|
||||||
jmp chrout_screen_done
|
jmp chrout_screen_done
|
||||||
*/
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
screen_check_space_ends_line:
|
||||||
|
|
||||||
|
jsr screen_get_logical_line_end_ptr
|
||||||
|
lda (PNT), y
|
||||||
|
cmp #$20
|
||||||
|
|
||||||
|
rts
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
screen_get_current_line_logical_length:
|
|
||||||
rts
|
|
||||||
|
|
||||||
/* YYY disabled for rework
|
|
||||||
|
|
||||||
screen_get_current_line_logical_length:
|
|
||||||
ldy TBLX
|
|
||||||
lda LDTBL,y
|
|
||||||
bpl !+
|
|
||||||
lda #79
|
|
||||||
.byte $2c // BIT absolute mode, which we use to skip the next two instruction bytes
|
|
||||||
!:
|
|
||||||
lda #39
|
|
||||||
sta LNMX
|
|
||||||
rts
|
|
||||||
*/
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
|
||||||
|
screen_get_logical_line_end_ptr:
|
||||||
|
|
||||||
|
ldy TBLX
|
||||||
|
cpy #24
|
||||||
|
bcs screen_get_logical_line_end_39 // last line of the screen
|
||||||
|
|
||||||
|
lda LDTBL, y
|
||||||
|
bpl screen_get_logical_line_end_39 // current line continues previous one
|
||||||
|
|
||||||
|
iny
|
||||||
|
lda LDTBL, y
|
||||||
|
bmi screen_get_logical_line_end_39 // current line is not continued
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
screen_get_logical_line_end_79:
|
||||||
|
|
||||||
|
ldy #79
|
||||||
|
rts
|
||||||
|
|
||||||
|
screen_get_logical_line_end_39:
|
||||||
|
|
||||||
|
ldy #39
|
||||||
|
rts
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
// YYY test all the cases!
|
// YYY test all the cases, does not work correctly yet!
|
||||||
|
|
||||||
|
|
||||||
screen_grow_logical_line_screen_up:
|
screen_grow_logical_line_screen_up:
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
|
|
||||||
//
|
|
||||||
// Normalise X and Y values
|
|
||||||
// If X < 0, then make X = X + 40 (or 80, if previous line is linked)
|
|
||||||
//
|
|
||||||
|
|
||||||
/* YYY disabled for rework
|
|
||||||
|
|
||||||
screen_normalize_xy:
|
|
||||||
|
|
||||||
lda PNTR
|
|
||||||
bpl x_not_negative
|
|
||||||
dec TBLX
|
|
||||||
// Check that we didn't go backwards off the top of the screen
|
|
||||||
bpl !+
|
|
||||||
lda #0
|
|
||||||
sta TBLX
|
|
||||||
|
|
||||||
!: jsr screen_add_40_to_PNTR
|
|
||||||
|
|
||||||
// Check if line is linked, if so, add 40 again
|
|
||||||
ldy TBLX
|
|
||||||
lda LDTBL,y
|
|
||||||
bpl !+
|
|
||||||
jsr screen_add_40_to_PNTR
|
|
||||||
!:
|
|
||||||
|
|
||||||
x_not_negative:
|
|
||||||
// Work out if X is too big
|
|
||||||
ldy TBLX
|
|
||||||
lda LDTBL,y
|
|
||||||
bpl !+
|
|
||||||
lda #79
|
|
||||||
skip_2_bytes_trash_nvz
|
|
||||||
!: lda #39
|
|
||||||
cmp PNTR
|
|
||||||
bcs x_not_too_big
|
|
||||||
|
|
||||||
// X value is too big, so subtract 40 and increment Y
|
|
||||||
lda PNTR
|
|
||||||
sec
|
|
||||||
sbc #40
|
|
||||||
sta PNTR
|
|
||||||
inc TBLX
|
|
||||||
|
|
||||||
x_not_too_big:
|
|
||||||
|
|
||||||
// Make sure Y isn't negative
|
|
||||||
lda TBLX
|
|
||||||
bpl !+
|
|
||||||
lda #0
|
|
||||||
sta TBLX
|
|
||||||
!:
|
|
||||||
// Make sure Y isn't too large for absolute size of
|
|
||||||
// screen
|
|
||||||
cmp #24
|
|
||||||
bcc !+
|
|
||||||
lda #24
|
|
||||||
sta TBLX
|
|
||||||
!:
|
|
||||||
// Make sure Y isn't too much for the screen, taking
|
|
||||||
// into account the line link table
|
|
||||||
ldy #24 // max allowable line
|
|
||||||
ldx #0
|
|
||||||
link_count_loop:
|
|
||||||
lda LDTBL,x
|
|
||||||
bpl !+
|
|
||||||
dey
|
|
||||||
!: inx
|
|
||||||
cpx #25
|
|
||||||
bne link_count_loop
|
|
||||||
tya
|
|
||||||
cmp TBLX
|
|
||||||
bcs y_ok
|
|
||||||
sta TBLX
|
|
||||||
y_ok:
|
|
||||||
rts
|
|
||||||
|
|
||||||
*/
|
|
||||||
Reference in new issue
Block a user