Main Menu
- The Library NEW
A FORUM FOR THE MASSES
C64FORUM.COM
My VGP.ca Referral Code Get $5 off your first purchase!
A FORUM FOR THE MASSES
C64FORUM.COM
My VGP.ca Referral Code Get $5 off your first purchase!
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