Extended keyboard use in C64 mode

Started by Blacklord, December 09, 2007, 09:49 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Blacklord

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