User Tools

Site Tools





Sidebar

prg:128001

Back to PRG index...

Topic: 128001 - 128 Keys in 64 Mode

This program will allow you to use the 128s special keys in C64 mode.

10 for x=49152t049185:read z:pokex,z:ck=ck+z:next
15 for x=x to 49285:poke x,peek(x+10770):next
20 poke49258,117:poke49259,192
25 for x=xt049454:read z:pokex,z:ck=ck+z:next
30 ifck<>26162thenprint"error in data lines...":end
35 print"it's magic1 128 keypad keys now active. "
40 print"[no scroll] and cursor keys, too.":sys49152:new
45 data 120,169,23,141,20,3,169,192,141,21,3,169,24,141,38,3,169,193,141,39
50 data 3,88,96,32,234,255,173,216,192,240,3,206,216,192,240,6,32,39,193,76
55 data 154,234,168,32,13,193,208,6,142,47,208,76,38,235,169,254,141,47,208
60 data 162,8,72,173,1,220,205,1,220,208,248,74,144,21,200,192,25,208,5,104
65 data 162,255,208,221,202,208,240,56,104,42,141,47,208,208,221,104,185
70 data 245,192,170,41,127,160,255,140,47,208,201,1,208,20,32,13,193,208
75 data 251,169,0,240,8,173,34,193,73,1,141,34,193,76,148,192,200,217,129
80 data 235,208,250,132,203,32,39,193,138,76,228,234,255,56,53,255,50,52,55
85 data 49,255,43,45,255,13,54,57,51,255,48,46,145,17,157,29,1,169,0,141,47
90 data 208,174,1,220,224,255,96,32,202,241,72,169,5,141,216,192,169,0,208
95 data 247,104,96,72,169,0,141,34,193,104,96

Another routine using the three extra keyscan lines at location $D02F follows. This routine wedges itself into the IRQ interrupt routine by diverting the IRQ vector at $0314/$0315 to point to the code. Note that to scan a given column in the key matrix (say, that connected to the K0 line), the output line is held low (logical zero); matrix columns that are not being scanned should have their respective output lines held high (logical one). (This is merely a Commodore convention; another manufacturer's system might scan a keyboard similarly but would reverse the process – scanned key matrix column output lines would be held high, while unscanned ones would be held low.)

This ML routine can be entered with the C-128's monitor but is executed while in C-64 mode. The routine is called by SYS51968. To deactivate, press RUN-STOP/RESTORE. (Note, other routines that use this memory area while cause conflicts.)

 0CB00 78       SEI         ; DISABLE INTERRUPTS.
 0CB01 A0 CB    LDY #$CB    ; DIRECT IRQ VECTOR TO CODE AT $CBOD.
 0CB03 A2 0D    LDX #$0D
 0CB05 8C 1C 03 STY $0315
 0CB08 8E 14 03 STX $0314
 0CB0B 58       CLI         ; ENABLE INTERRUPTS.
 0CB0C 60       RTS         ; RETURN TO CALLER.
 0CB0D A2 F8    LDX #$F8    ; %1111 1000
 0CB0F 8E 2F D0 STX $D02F   ; ALL 3 EXTENDED KB OUTPUT LINES ACTIVE.
 0CB12 A9 FF    LDA #$FF
 0CB14 8D 00 DC STA $DC00   ; CIA #1'S DDR SET FOR ALL 8 LINES AS INPUTS.
 0CB17 CD 01 DC CMP $DC01   ; NOT = $FF? KEY HELD DOWN,
 0CB1A D0 06    BNE $CB22   ;    SO PROCESS IT.
 0CB1C 8D 2F D0 STA $D02F   ; ELSE ALL KB OUTPUT LINES INACTIVE.
 0CB1F 4C 31 EA JMP $EA31   ; JUMP TO NORMAL IRQ HANDLER CODE.
 0CB22 A9 FB    LDA #$FB    ; %1111 10111 ... K2'S COLUMN SCANNED FIRST.
 0CB24 8D 2F D0 STA $D02F
 0CB27 A2 00    LDX #$00    ; ZERO SHIFT/CTRL/CBM FLAG.
 0CB29 8E 8D 02 STX $028D
 0CB2C A0 08    LDY #$08    ; COUNTER ... 8 ROWS TO TEST.
 0CB2E AD 01 DC LDA $DC01   ; READ INPUT PORT.
 0CB31 CD 01 DC CMP $DC01   ; VALUE CHANGING?
 0CB34 D0 F8    BNE $CB2E   ; YES, LOOP AGAIN FOR ANOTHER READ.
 0CB36 C9 FF    CMP #$FF    ; ANY KEYS IN THIS COLUMN DEPRESSED?
 0CB38 D0 0A    BNE $CB44   ; YES, PROCESS KEYSTROKE.
 0CB3A 18       CLC         ; CLEAR .C TO PREPARE FOR ADD.
 0CB3B 8A       TXA         ; GET KEY NUMBER (INDEX) AND
 0CB3C 69 08    ADC #$08    ;    ADD 8 SINCE WE CAN SKIP THIS COLUMN.
 0CB3E AA       TAX         ; PUT INDEX BACK WHERE IT BELONGS.
 0CB3F 6E 2F D0 ROR $D02F   ; NOW K1 HELD LOW (%1111 1101).
 0CB42 D0 E8    BNE $CB2C   ; ZERO? NO WAY! WE'RE FORCING A JUMP
                            ;     TO $CB2C TO SCAN THE NEXT COLUMN.
 0CB44 4A       LSR         ; PROCESS KEYSTROKE ... SHIFT BITS INTO .C .
 0CB45 90 09    BCC $CB50   ; IF .C = 0 KEY STRUCK, SO WE QUIT SCANNING.
 0CB47 E8       INX         ; BUMP KEY INDEX COUNTER.
 0CB48 88       DEY         ; DECREMENT ROW COUNTER.
 0CB49 D0 F9    BNE $CB44   ; 8 ROWS DONE? NO, THEN LOOP AGAIN.
 0CB4B 6E 2F D0 ROR $D02F   ; PREPARE TO SCAN NEXT COLUMN. (KN=0)
 0CB50 BD 69 CB LDA $CB69,X ; LOOK UP C-64 KEYCODE FROM TABLE.
 0CB53 10 07    BPL $CB5C   ; IF HI-BIT (#7) SET, IT'S <SHIFT>ED,
 0CB55 A0 01    LDY #$01    ;     SO WE SET SHIFT FLAG.
 0CB57 8C 8D 02 STY $028D
 0CB5A 29 7F    AND #$7F    ; AND LOP OFF BIT#7 TO GET TRUE C-64 KEYCODE.
 0CB5C 85 CB    STA $CB     ; SAVE KEYCODE.
 0CB5E A6 FF    LDX $FF
 0CB60 8E 2F D0 STX $D02F   ; DEACTIVATE EXTENDED KEYSCAN LINES.
 0CB63 20 DD EA JSR $EADD   ; CONVERT KEYCODE TO ASCII BYTE, PLACE IN
                            ; BUFFER.
 0CB66 4C 7E EA JMP $EA7E   ; RESTORE REGISTER CONTENTS & RETURN FROM IRQ.
>0CB69 40 23 2C 87 07 82 02 40 40 28 28 40 01 13 20 08
>0CB79 40 1B 10 40 3B 0B 18 38 40
prg/128001.txt · Last modified: 2023/09/26 12:24 by David