66.include "screenmap.inc"
77
88.include "c128_system.inc"
9- .include "c128_system.inc"
9+
1010.include "tools/misc.inc"
1111.include "tools/intrinsics.inc"
1212
1313; Debug defines
1414;SHOW_DEBUG_SPRITE = 1
15- ;KEYBOARD_DEBUG_PRINT = 1
15+ KEYBOARD_DEBUG_PRINT = 1
16+
17+ .ifdef C64
18+ CMDR_SHIFT_LOCK = $291
19+ .else
20+ CMDR_SHIFT_LOCK = LOCKS
21+ .endif
1622
1723; Zeropage variables
1824CONSOLE_PTR = SCREEN_PTR ; $e0
@@ -243,7 +249,7 @@ basicstub:
243249
244250 MAIN_APPLICATION_LEN = (MAIN_APPLICATION_END-MAIN_APPLICATION)
245251
246- ; Switch to default C128 config
252+ ; Switch to default C128 config. Doesn't hurt on C64
247253 lda #$00
248254 sta MainExitFlag
249255 sta MMU_CR_IO
@@ -253,10 +259,10 @@ basicstub:
253259 sei
254260
255261 ; Save lock state and disable it
256- lda LOCKS
262+ lda CMDR_SHIFT_LOCK
257263 sta LockFlag
258264 lda #$ff
259- sta LOCKS
265+ sta CMDR_SHIFT_LOCK
260266
261267 ; Save Zeropage
262268 ldy #ZP_BASE_LEN
@@ -324,6 +330,7 @@ basicstub:
324330 lda #SPRITE_BUFFER_LEN
325331 sta Multiplier
326332
333+ jsr DetectSystem
327334 jsr CopyKeytables
328335
329336 ; Reset all sprite expansions
@@ -372,7 +379,7 @@ basicstub:
372379 bpl @ZPRestore
373380
374381 lda LockFlag
375- sta LOCKS
382+ sta CMDR_SHIFT_LOCK
376383
377384 cli
378385
@@ -437,6 +444,53 @@ basicstub:
437444 rts
438445.endproc
439446
447+ .proc DetectSystem
448+ lda #0
449+ sta SystemMode
450+
451+ ldy #3
452+ @C64Check:
453+ lda $eb81 ,y
454+ cmp C64Id,y
455+ bne @IsC128
456+ dey
457+ bpl @C64Check
458+
459+ ; It's a C64, now check if it is a real one
460+ lda SystemMode
461+ ora #C64_MODE
462+ sta SystemMode
463+
464+ ; TODO: Will this also work on M65?
465+ lda #$00
466+ sta VIC_KBD_128
467+ lda VIC_KBD_128
468+ ldy #C64_MODE
469+ cmp #$ff
470+ beq @Done
471+
472+ lda SystemMode
473+ ora #C128_MODE
474+ sta SystemMode
475+ jmp @Done
476+
477+ @IsC128:
478+ ldy #3
479+ @C128Check:
480+ lda $eb81 ,y
481+ cmp C64Id,y
482+ bne @Done
483+ dey
484+ bpl @C128Check
485+
486+ lda SystemMode
487+ ora #C128_MODE
488+ sta SystemMode
489+
490+ @Done:
491+ rts
492+ .endproc
493+
440494.proc FarCaller
441495 jmp (FARCALL_PTR)
442496.endproc
@@ -531,66 +585,70 @@ MAIN_APPLICATION = *
531585; so we can easily access it.
532586.proc CopyKeytables
533587
534- ; Standard keytable without modifiers
535- SetPointer $fa80 , MEMCPY_SRC
588+ lda SystemMode
589+ and #C64_MODE
590+ beq @C128_KT
591+
592+ SetPointer KT_64_NORMAL, KeytableNormal
593+ SetPointer KT_64_SHIFT, KeytableShift
594+ SetPointer KT_64_COMMODORE, KeytableCommodore
595+ SetPointer KT_64_CONTROL, KeytableControl
596+ SetPointer KT_64_ALT, KeytableAlt
597+
598+ jmp @CopyTables
599+
600+ @C128_KT:
601+ SetPointer KT_128_NORMAL, KeytableNormal
602+ SetPointer KT_128_SHIFT, KeytableShift
603+ SetPointer KT_128_COMMODORE, KeytableCommodore
604+ SetPointer KT_128_CONTROL, KeytableControl
605+ SetPointer KT_128_ALT, KeytableAlt
606+
607+ @CopyTables:
608+ CopyPointer KeytableNormal, MEMCPY_SRC
536609 SetPointer SymKeytableNormal, MEMCPY_TGT
537610
538611 ldy #KeyTableLen
539612 jsr memcpy255
540- lda MEMCPY_TGT
541- sta KeytableNormal
542- lda MEMCPY_TGT HI
543- sta KeytableNormal HI
613+ CopyPointer MEMCPY_TGT, KeytableNormal
544614
545615 ; Shifted keys
546- SetPointer $fad9 , MEMCPY_SRC
616+ CopyPointer KeytableShift , MEMCPY_SRC
547617 SetPointer SymKeytableShift, MEMCPY_TGT
548618
549619 ldy #KeyTableLen
550620 jsr memcpy255
551- lda MEMCPY_TGT
552- sta KeytableShift
553- lda MEMCPY_TGT HI
554- sta KeytableShift HI
621+ CopyPointer MEMCPY_TGT, KeytableShift
555622
556623 ; Commodore keys
557- SetPointer $fb32 , MEMCPY_SRC
624+ CopyPointer KeytableCommodore , MEMCPY_SRC
558625 SetPointer SymKeytableCommodore, MEMCPY_TGT
559626
560627 ldy #KeyTableLen
561628 jsr memcpy255
562- lda MEMCPY_TGT
563- sta KeytableCommodore
564- lda MEMCPY_TGT HI
565- sta KeytableCommodore HI
629+ CopyPointer MEMCPY_TGT, KeytableCommodore
566630
567631 ; CTRL keys
568- SetPointer $fb8b , MEMCPY_SRC
632+ CopyPointer KeytableControl , MEMCPY_SRC
569633 SetPointer SymKeytableControl, MEMCPY_TGT
570634
571635 ldy #KeyTableLen
572636 jsr memcpy255
573- lda MEMCPY_TGT
574- sta KeytableControl
575- lda MEMCPY_TGT HI
576- sta KeytableControl HI
577-
578- ; Unused keycode in the kernel
579- ; but we want it, so we patch it
580- lda #$a0
581- ldy #$00 ; DEL
582- sta SymKeytableControl,y
637+ CopyPointer MEMCPY_TGT, KeytableControl
583638
584639 ; ALT keys
585- SetPointer $fbe4 , MEMCPY_SRC
640+ CopyPointer KeytableAlt , MEMCPY_SRC
586641 SetPointer SymKeytableAlt, MEMCPY_TGT
587642
588643 ldy #KeyTableLen
589644 jsr memcpy255
590- lda MEMCPY_TGT
591- sta KeytableAlt
592- lda MEMCPY_TGT HI
593- sta KeytableAlt HI
645+ CopyPointer MEMCPY_TGT, KeytableAlt
646+
647+ ; Unused keycode in the kernel
648+ ; but we want it, so we patch it
649+ lda #$a0
650+ ldy #$00 ; DEL
651+ sta SymKeytableControl,y
594652
595653 rts
596654.endproc
@@ -4709,6 +4767,10 @@ SCANKEYS_BLOCK_IRQ = 1
47094767; 1 2 3 4
47104768; 0123456789012345678901234567890123456789
47114769VersionTxt: .byte "SPREDDI V1.00 BY GERHARD GRUBER 2021" ,0
4770+ C64Id: .byte $14 , $0d , $1d , $88
4771+
4772+ C128Id: .word $fa80
4773+ .byte $14 , $0d , $1d , $88
47124774
47134775; Saving/Loading
47144776FilenameDefaultTxt: .byte "spritedata" ; Filename is in PETSCII
@@ -4862,13 +4924,17 @@ SpriteEditorKeyMap:
48624924 DefineKey KEY_SHIFT, $93 , NO_REPEAT_KEY, ClearGridHome ; CLEAR
48634925 DefineKey KEY_SHIFT|KEY_CTRL, $94 , REPEAT_KEY, InsertColumns ; CTRL-INS
48644926 DefineKey KEY_SHIFT|KEY_COMMODORE, $94 , REPEAT_KEY, InsertLine ; CMDR-INS
4927+ DefineKey KEY_SHIFT|KEY_COMMODORE, $91 , REPEAT_KEY, ShiftGridUp ; SHIFT CMDR CRSR Up
4928+ DefineKey KEY_SHIFT|KEY_COMMODORE, $9d , REPEAT_KEY, ShiftGridLeft ; SHIFT CMDR CRSR Left
48654929
48664930 ; COMMODORE keys
48674931 DefineKey KEY_COMMODORE, $aa , NO_REPEAT_KEY, AppendFrameCopy ; CMDR-N
48684932 DefineKey KEY_COMMODORE, $b3 , REPEAT_KEY, ShiftGridUp ; CMDR-W
48694933 DefineKey KEY_COMMODORE, $ae , REPEAT_KEY, ShiftGridDown ; CMDR-S
48704934 DefineKey KEY_COMMODORE, $b0 , REPEAT_KEY, ShiftGridLeft ; CMDR-A
48714935 DefineKey KEY_COMMODORE, $ac , REPEAT_KEY, ShiftGridRight ; CMDR-D
4936+ DefineKey KEY_COMMODORE, $91 , REPEAT_KEY, ShiftGridDown ; CMDR CRSR-Down
4937+ DefineKey KEY_COMMODORE, $9d , REPEAT_KEY, ShiftGridRight ; CMDR CRSR-Right
48724938 DefineKey KEY_COMMODORE, $94 , REPEAT_KEY, DeleteLine ; CMDR-DEL
48734939
48744940 ; CONTROL keys
@@ -4903,6 +4969,7 @@ BSS_START = *
49034969; Functionpointer to the current keyboardhandler
49044970EditorKeyHandler: .word 0
49054971WelcomeDone: .word 0
4972+ SystemMode: .byte 0 ; C64/C128/M65
49064973
49074974TMP_VAL_0: .word 0
49084975TMP_VAL_1: .word 0
0 commit comments