09       .OPT NO LIST
10 ;  SAVE #D1:KEYBDIRQ.M65
20 ;
30 ;
40 ;  LOAD #D1:CASSETTE.M65
50 ;
52       .PAGE "Keyboard IRQ Handler"
60 ;  *= $FC19
61        LIST  
63       .LOCAL 
70 ;
80 ; Keyboard IRQ processing routines
0100 ; Note all references to f1, f2,
0110 ; etc. and LED's are to 1200xl.
0120 ; The code for these is in all
0130 ; xl/xe rom's even though the
0140 ; hardware is not.
0150 ;
0160 ; On the 1200xl, bits 2 and 3 of
0170 ; PortB control LED's 1 (kbd)
0180 ; and 2 (charset). LED's are on
0190 ; when bits are off.
0200 ;
0210 ; A program using 130xe bank
0220 ; switching should be unaffected
0230 ; as long as the OS is in ROM.
0240 ; A custom OS which accesses the
0250 ; 1200xl functions, however, may
0260 ; result in unwanted changes in
0270 ; PortB.
0280 ;
064537 KIR TXA       Save registers
064538   PHA 
064539   TYA 
064540   PHA 
064541   LDY PORTB   For led's
064544   LDA KBCODE  Is key same as
064547   CMP CH1     last accepted?
064550   BNE ?GOTKEY Go if not.
064552   LDX KEYDEL  Exit if bounce
064555   BNE ?RESET  time not done.
064557 ?GOTKEY LDX KEYDIS
064560   CMP #$83    Control f1?
064562   BNE ?NOTCF1
064564   TXA         Toggle keyboard
064565   EOR #$FF    disable flag.
064567   STA KEYDIS  Nonzero=kbd off
064570   BNE ?LED1ON Go if now off.
064572   TYA         PortB to a
064573   ORA #4      Set b2 (LED off)
064575   BNE ?GOTCF1 Go always.
064577 ?LED1ON TYA   PortB to a. Kill
064578   AND #$FB    bit2 (LED1 on)
064580 ?GOTCF1 TAY   New PortB to y
064581   BCS ?VALID  Go always
064583 ?NOTCF1 TXA   Recheck delay
064584   BNE ?EXIT   Go if not done
064586   LDA KBCODE  Get key again
064589   TAX         and copy in x
064590   CMP #159    Control 1?
064592   BNE ?HELP?
064594   LDA SSFLAG  Yes, toggle flag
064597   EOR #$FF    (nonzero=freeze)
064599   STA SSFLAG
064602   BCS ?VALID  Go always
064604 ?HELP? AND #$3F Mask Shft/Ctrl
064606   CMP #17     If not Help, go
064608   BNE ?SCREN? check others
064609 ;      else save actual
064610   STX HELPFG  key press here
064613   BEQ ?VALID  only. Go always.
064615 ?STOWIT STX CH Update user and
064618   STX CH1     last key reg's
064621 ?VALID LDA #3 Valid key exit.
064623   STA KEYDEL  Set bounce delay
064626   LDA #0      and kill attract
064628   STA ATRACT  mode
064630 ?RESET LDA KRPDEL Reset key
064633   STA SRTIMR  repeat timer
064636   LDA SDMCTL  Is screen on?
064639   BNE ?EXIT   If so, exit
064641   LDA DMASAV  Restore screen
064644   STA SDMCTL  on any keypress
064647 ?EXIT STY PORTB Enable led's
064650   PLA         Restore reg's
064651   TAY 
064652   PLA 
064653   TAX 
064654   PLA 
064655   RTI 
064656 ?SCREN? CPX #$84 Control f2?
064658   BEQ ?GOTCF2
064660   CPX #$94    Control f4?
064662   BNE ?STOWIT Go if not.
064664   LDA CHBAS   Else switch the
064667   LDX CHSALT  character sets
064670   STA CHSALT  Alt.=Old Active
064673   STX CHBAS   Active=Old Alt.
064676   CPX # >CHARSET2 Go if alt.
064678   BEQ ?LED2ON set now active
064680   TYA         PortB to a
064681   ORA #8      Set bit3
064683   TAY         Back to y
064684   BNE ?VALID  Go always.
064686 ?LED2ON TYA   PortB to a
064687   AND #$F7    Kill b3 (LED on)
064689   TAY         Back to y
064690   JMP ?VALID
064693 ?GOTCF2 LDA SDMCTL Toggle S:
064696   BEQ ?EXIT   Go if off
064698   STA DMASAV  Else save value
064701   LDA #0      for auto restore
064703   STA SDMCTL  and kill screen
064706   BEQ ?EXIT   Go always
064708 FDL PHA       Display list
064709   LDA COLOR2  interrupt code
064712    AEOR  COLRSH for fine scroll
064715    AAND  DRKMSK
064718   STA WSYNC
064721   STA COLPF1
064724   PLA 
064725   RTI 
064726   .BYTE 0,0   Unused bytes
