Extended Keyboard Use on the C-128 in C-64 Mode Dave Kline 07/01/00 McGraw/Hill Because extra registers are present in the C-64 mode on the C-128, you can use the C-128 extended keyboard in C-64 mode. A 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 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