09       .OPT NO LIST
10 ;  SAVE #D1:SCREEN2.M65
20 ;
30 ;
40 ;  LOAD #D1:SCREEN3.M65
50 ;
55        LIST  
60 ; begin keyboard handler
062200 IGN LDA #$FF  Ignore character
062202   STA CH      do
062205 KGB LDA #0    Keybrd get-byte
062207   STA SUPERF
062210   LDA ICAX1Z  If forced read
062212   LSR A       mode, exit
062213   BCS ?GETOUT
062215   LDA #$80    Test break key
062217   LDX BRKKEY
062219   BEQ ?K7
062221   LDA CH
062224   CMP #$FF
062226   BEQ KGB
062228   STA HOLDCH  save for shift lock proc
062230   LDX #$FF    Clear ch
062232   STX CH
062235   LDX NOCLIK
062238   BNE ?OVRCLK
062240   JSR CLICK   Go make noise
062243 ?OVRCLK TAY 
062244   CPY #$C0    Test for shift
062246   BCS IGN     and control
062248   LDA (KEYDEF),Y
062250 ?SAVEK STA ATACHR
062253   TAX 
062254   BMI ?SPEC
062256   JMP ?K6A
062259 ?SPEC CMP #$80 Null?
062261   BEQ IGN     Yeah, ignore
062263   CMP #$81    Atari key?
062265   BNE ?KGETC1
062267   LDA INVFLG  Yes
062270   EOR #$80
062272   STA INVFLG
062275   BCS IGN     Go always
062277 ?KGETC1 CMP #$82 Caps/Lower?
062279   BNE ?K1
062281   LDA SHFLOK  If uppercase
062284   BEQ ?KGETC2 go switch to lower
062286   LDA #0      Switch to
062288   STA SHFLOK  all upper case
062291   BEQ IGN     Go always
062293 ?K1 CMP #$83  Shift-Caps?
062295   BNE ?K2
062297 ?KGETC2 LDA #$40 Force upper
062299   STA SHFLOK  case
062302   BNE IGN
062304 ?K2 CMP #$84  Control-Caps?
062306   BNE ?K3
062308   LDA #$80    Force control
062310   STA SHFLOK  lock
062313   JMP IGN
062316 ?K3 CMP #$85  Control-3?
062318   BNE ?K6
062320   LDA #136    Do end of file
062322 ?K7 STA DSTAT
062324   STA BRKKEY  Restore break key
062326 ?GETOUT LDA #155
062328   JMP ?K8
062331 ?K6 CMP #$89  Control-f3?
062333   BNE ?FN1
062335   LDA NOCLIK  Toggle key
062338   EOR #$FF    click
062340   STA NOCLIK
062343   BNE ?JMPKGB
062345   JSR CLICK
062348 ?JMPKGB JMP IGN
062351 ?FN1 CMP #$8D+1 Test for
062353   BCS ?FN2    1200xl
062355   CMP #$8A    function keys
062357   BCC ?JMPKGB
062359   SBC #$8A
062361   ASL HOLDCH  Orig kbcode
062363   BPL ?GETFK  Go if not shifted
062365   ORA #4      Add 4 to index
062367 ?GETFK TAY    Get 1200xl
062368   LDA (FKDEF),Y function key
062370   JMP ?SAVEK
062373 ?FN2 CMP #$91+1 If >Shift+Fn
062375   BCS ?K6A
062377   CMP #$8E    If just fn key
062379   BCC ?JMPKGB exit
062381   SBC #$72    Convert code
062383   INC SUPERF  Flag fn
062386   BNE ?K8     Go always
062388 ?K6A LDA HOLDCH Process shift locks
062390   CMP #$40    Regular take precedence
062392   BCS ?K5     over lock
062394   LDA ATACHR  Test for alpha
062397   CMP #'a
062399   BCC ?K5
062401   CMP #'z+1
062403   BCS ?K5
062405   LDA SHFLOK  Do shift/control lock
062408   BEQ ?K5     If none don't redo
062410   ORA HOLDCH
062412   JMP ?OVRCLK Do retry
062415 ?K5 JSR ?TSTCTL Don't invert msb
062418   BEQ ?K4     of control chars
062420   LDA ATACHR
062423   EOR INVFLG
062426 ?K8 STA ATACHR
062429 ?K4 JMP STATUS.S Done
062432 ESCAPE LDA #$80 Handle Esc
062434   STA ESCFLG
062437   RTS 
062438 CRSRUP DEC ROWCRS Cursor up
062440   BPL ?COMRET
062442   LDX BOTSCR  wrap around
062445   DEX 
062446 ?UPDNCM STX ROWCRS
062448 ?COMRET JMP ?STRBEG Convert to log col and return
062451 CRSRDN INC ROWCRS Cursor down
062453   LDA ROWCRS
062455   CMP BOTSCR
062458   BCC ?COMRET
062460   LDX #0
062462   BEQ ?UPDNCM Always
062464 CRSRLF DEC COLCRS Cursor left
062466   LDA COLCRS
062468   BMI CRSRL1  If outside lmargn
062470   CMP LMARGN  then wrap around
062472   BCS ?COMRE1
062474 CRSRL1 LDA RMARGN To rt margin
062476 ?LFRTCM STA COLCRS Set column
062478 ?COMRE1 JMP ?DOLCOL To log col
062481 CRSRRT INC COLCRS Move cursor
062483   LDA COLCRS  right
062485   CMP RMARGN
062487   BCC ?COMRE1
062489   BEQ ?COMRE1
062491 CRSRLM LDA LMARGN To lt margin
062493   JMP ?LFRTCM
062496 CLRSCR JSR ?PUTMSC Clear screen
062499   LDY ADRESS
062501   LDA #0
062503   STA ADRESS
062505 ?CLRSC2 STA (ADRESS),Y
062507   INY 
062508   BNE ?CLRSC2
062510   INC ADRESS+1
062512   LDX ADRESS+1
062514   CPX RAMTOP
062516   BCC ?CLRSC2
062518   LDA #$FF
062520 ?CLRSC3 STA LOGMAP,Y
062523   INY         Clean up logical
062524   CPY #4      line bit map
062526   BCC ?CLRSC3
062528 HOME JSR ?COLCR Home cursor
062531   STA LOGCOL  Place colcrs at left edge
062533   STA BUFSTR+1
062535   LDA #0
062537   STA ROWCRS
062539   STA COLCRS+1
062541   STA BUFSTR
062543   RTS 
062544 BKSDEL LDA LOGCOL Backspace
062546   CMP LMARGN
062548   BEQ ?BS1
062550   LDA COLCRS  Left edge?
062552   CMP LMARGN
062554   BNE ?BS3    No
062556   JSR ?DELTIM See if line should be deleted
062559 ?BS3 JSR CRSRLF Move left
062562   LDA COLCRS
062564   CMP RMARGN  Up a line?
062566   BNE ?BS2    No
062568   LDA ROWCRS  Move up unless
062570   BEQ ?BS2    at top
062572   JSR CRSRUP  Move up
062575 ?BS2 LDA #32  Destructive
062577   STA ATACHR
062580   JSR ?OUTPLT
062583 ?BS1 JMP ?DOLCOL Done
062586 TABKEY JSR CRSRRT Handle TAB
062589   LDA COLCRS  Begin search
062591   CMP LMARGN  Test for new line
062593   BNE ?TAB1
062595   JSR ?DOCR   Do carriage return
062598   JSR ?LOGGET Test end of log line
062601   BCS ?TAB2
062603 ?TAB1 LDA LOGCOL Check for
062605   JSR ?BITGET tab stop
062608   BCC TABKEY  Keep looking
062610 ?TAB2 JMP ?DOLCOL
062613 SETTAB LDA LOGCOL Set TAB
062615   JMP ?BITSET Set bit in map
062618 CLRTAB LDA LOGCOL Clear TAB
062620   JMP ?BITCLR Clear bit in map
062623 INSCHR JSR ?PHACRS Insert char
062626   JSR ?GETPLT Get char under crsr
062629   STA INSDAT
062631   LDA #0
062633   STA SCRFLG
062636 ?INSCH4 JSR ?OUTCH2 Store data
062639   LDA LOGCOL  Save logcol. If after
062641   PHA         incrsa, logcol< than
062642   JSR ?INCRSA now, end loop
062645   PLA 
062646   CMP LOGCOL
062648   BCS ?INSCH3 Quit
062650   LDA INSDAT  Keep going
062652   PHA 
062653   JSR ?GETPLT
062656   STA INSDAT
062658   PLA 
062659   JMP ?INSCH4
062662 ?INSCH3 JSR ?PLACRS
062665 ?INSCH6 DEC SCRFLG If scroll
062668   BMI ?INSCN5 occurred, move
062670   DEC ROWCRS  cursor up
062672   BNE ?INSCH6 Repeat until scrflg is -ve
062674 ?INSCN5 JMP ?DOLCOL
062677 DELCHR JSR ?PHACRS Delete chr
062680 ?DELCH1 JSR ?CONVRT Get data to rt of cursor
062683   LDA ADRESS  Save destination
062685   STA SAVADR  address
062687   LDA ADRESS+1
062689   STA SAVADR+1
062691   LDA LOGCOL
062693   PHA 
062694   JSR ?INCRSB Put crsr over next chr
062697   PLA         Test new logcol
062698   CMP LOGCOL  against old. Done
062700   BCS ?DELCH2 if old >= new
062702   LDA ROWCRS  row off screen
062704   CMP BOTSCR
062707   BCS ?DELCH2
062709   JSR ?GETPLT Get data under
062712   LDY #0      cursor
062714   STA (SAVADR),Y Put in prior spot
062716   BEQ ?DELCH1 Go always
062718 ?DELCH2 LDY #0 Clear last
062720   TYA         position
062721   STA (SAVADR),Y
062723   JSR ?DELTIA Try to delete line
062726   JSR ?PLACRS
062729   JMP ?DOLCOL Done
062732 INSLIN SEC    Insert line
062733 ?INSLIA JSR ?EXTEND
062736   LDA LMARGN  Do carriage ret
062738   STA COLCRS  no line feed
062740   JSR ?CONVRT get address
062743   JSR ?MOVLIN Copy line down
062746   JSR ?CLRLIN Clear present line
062749   JMP ?DOLCOL Done
062752 DELLIN JSR ?DOLCOL Del line
062755   LDY HOLD1   Squeeze bitmap
062757   STY ROWCRS  put cursor there
062759 ?DELLIB LDY ROWCRS
062761 ?DELLI1 TYA 
062762   SEC 
062763   JSR ?LO2GET Get next bit
062766   PHP 
062767   TYA 
062768   CLC 
062769   ADC #120
062771   PLP 
062772   JSR ?BITPUT Write over present
062775   INY         bit
062776   CPY #24
062778   BNE ?DELLI1
062780   LDA LOGMAP+2 Set lsb
062783   ORA #1
062785   STA LOGMAP+2
062788   LDA #0
062790   STA COLCRS
062792   JSR ?CONVRT
062795   JSR ?SCROL1
062798   JSR ?LOGGET Test next for continuation
062801   BCC ?DELLIB Not new log line
062803   JMP CRSRLM
062806 BELL LDY #$20 Sound bell
062808 ?BELL1 JSR CLICK
062811   DEY 
062812   BPL ?BELL1
062814   RTS 
062815 CRSBOT JSR HOME Cursor to
062818   JMP CRSRUP  bottom
