diff level2/modules/keydrv_cc3.asm @ 1254:5bced1e03639

Changed to new naming convention
author boisy
date Sun, 17 Aug 2003 16:25:29 +0000
parents
children 67e11bfc9cd4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/keydrv_cc3.asm	Sun Aug 17 16:25:29 2003 +0000
@@ -0,0 +1,333 @@
+********************************************************************
+* KeyDrv - Keyboard Driver for CoCo 3
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 4      L2 Upgrade distribution version
+*        Annotations by Robert Gault                    RG  98/10/10
+
+         nam   KeyDrv
+         ttl   Keyboard Driver for CoCo 3
+
+* Disassembled 98/09/09 09:02:10 by Disasm v1.6 (C) 1988 by RML
+
+         ifp1  
+         use   defsfile
+         endc  
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  equ   4
+
+         mod   eom,name,tylg,atrv,start,size
+size     equ   .
+
+name     fcs   /KeyDrv/
+         fcb   edition
+
+start    lbra  Init       init/term; CLRB RTS
+         lbra  Term
+         lbra  FuncKeys   test for keys F1, F2
+
+ReadKys  ldu   <D.CCMem   CC3IO global memory $1000
+         ldx   #PIA0Base  base address of PIA#1
+         clrb  
+         comb  
+         stb   $02,x      clear all strobe lines
+         ldb   ,x         read PIA#1
+         comb             bit values 0=off 1=on
+         andb  #%00001111 keep only buttons
+         bne   L0059      branch if button pushed; error routine
+         clr   $02,x      enable all strobe lines
+         lda   ,x         read PIA#1
+         coma  
+         anda  #%01111111 mask only the joystick conparator
+         beq   L0042      branch if no keys pressed
+         pshs  dp
+         tfr   u,d
+         tfr   a,dp       set DP to the address in regU
+         bsr   L005C      evaluate the found key matrix
+         puls  dp         return to system DP
+         bpl   L005B      valid key
+L0042    clra             regA    would have been the found key
+         ldb   <G.CapLok,u CapsLock/SysRq key down flag
+         bne   L0056
+         clr   <G.KTblLC,u Key table entry# last checked (1-3)
+         coma  
+         comb  
+         sta   <G.LKeyCd,u last keyboard code
+         sta   <G.2Key1,u 2nd key table storage; $FF=none
+         std   <G.2Key2,u format (Row/Column)
+L0056    clr   <G.CapLok,u see above
+L0059    ldb   #$FF
+L005B    rts   
+
+L005C    ldx   #PIA0Base  base value of PIA#1
+         clra  
+         clrb  
+         std   <G.ShftDn  shift/CTRL flag; 0=NO $FF=YES
+         std   <G.KeyFlg  PIA bits/ALT flag
+*	%00000111-Column # (Output, 0-7)
+*	%00111000-Row # (Input, 0-6)
+         coma  
+         comb             set primary key table
+         std   <G.Key1    key 1&2 flags $FF=none
+         sta   <G.Key3    key 3      ²
+         deca             ie. lda #%11111110
+         sta   $02,x      strobe one column
+L006E    lda   ,x         read PIA#1
+         coma  
+         anda  #$7F       keep only keys, bit 0=off 1=on
+         beq   L0082
+         ldb   #$FF       preset counter to -1
+L0077    incb  
+         lsra             bit test regA
+         bcc   L007E      no key so branch
+         lbsr  L010E      convert column/row to matrix value and store it
+L007E    cmpb  #$06       max counter
+         bcs   L0077      loop if more bits to test
+L0082    inc   <G.KeyFlg  counter; used here for column
+         orcc  #Carry     bit marker; disable strobe
+         rol   $02,x      shift to next column
+         bcs   L006E      not finished with columns so loop
+         lbsr  L0166      simultaneous check; recover key matrix value
+         bmi   L00F5      invalid so go
+         cmpa  <G.LKeyCd  last keyboard code	
+         bne   L0095
+         inc   <G.KySame  same key flag ?counter?
+L0095    sta   <G.LKeyCd  setup for last key pressed
+         beq   L00B5
+         suba  #$1A       the key value (matrix) of Z
+         bhi   L00B5      not a letter so go
+         adda  #$1A       restore regA
+         ldb   <G.CntlDn  CTRL flag
+         bne   L00E0      CTRL is down so go
+         adda  #$40       convert to ASCII value; all caps
+         ldb   <G.ShftDn  shift key flag
+         ldy   <G.CurDev  get current device static memory pointer
+         eorb  <$21,y     caps lock and keyboard mouse flags
+         andb  #$01       test caps flag
+         bne   L00E0      not shifted so go
+         adda  #$20       convert to ASCII lower case
+         bra   L00E0
+* key is not a letter; this routine is not based on some underlining principle of
+* the keyboard hardware. It is also a function of the decode table at $1DC,pcr.
+L00B5    ldb   #$03
+         mul              regB = (key#-26) times 3
+         lda   <G.ShftDn  shift key flag
+         beq   L00BF      not shifted so go
+         incb  
+         bra   L00C5
+L00BF    lda   <G.CntlDn  CTRL flag
+         beq   L00C5
+         addb  #$02
+L00C5    ldx   <G.CurDev  point regX to device’s static memory
+         lda   <$22,x     key sense flag
+         beq   L00D0      not set so go
+         cmpb  #$11       spacebar
+         ble   L00F3      must be an arrow so go
+L00D0    cmpb  #$4C       SHIFTed ALT key
+         blt   L00D8      not ALT, CTRL, F1, F2, or SHIFT so go
+         inc   <G.AltDwn  flag special keys (ALT,CTRL)
+         subb  #$06
+L00D8    leax  >L01DC,pcr decode table
+         lda   b,x
+         bmi   L00F6      if regA = $81 - $84
+* several entries to this routine from any key press; regA is already ASCII
+L00E0    ldb   <G.AltDwn  was ALT flagged?
+         beq   L00F0      no so go
+         cmpa  #$3F       ?	
+         bls   L00EE      # or code
+         cmpa  #$5B       [
+         bcc   L00EE      capital letter so go
+         ora   #$20       convert to lower case
+L00EE    ora   #$80       set for ALT characters
+L00F0    andcc  #^Negative not negative
+         rts   
+L00F3    orcc  #Negative  set negative
+L00F5    rts   
+L00F6    inc   <G.CapLok  caps lock/SysRq
+         inc   <G.Clear   one shot caps lock/SysRq
+         bra   L00F0
+L00FC    pshs  b,a        convert column into power of 2
+         clrb  
+         orcc  #Carry
+         inca  
+L0102    rolb  
+         deca  
+         bne   L0102
+         bra   L0108      WHY IS THIS HERE??
+L0108    orb   <G.KySns   previous value of column
+         stb   <G.KySns
+         puls  pc,b,a
+L010E    pshs  b,a
+         cmpb  #$03       is it row 3?
+         bne   L011C
+         lda   <G.KeyFlg  get column #
+         cmpa  #$03       is it column 3?; ie up arrow
+         blt   L011C      if lt must be a letter
+         bsr   L00FC      its a non letter so bsr
+L011C    lslb             B*8  8 keys per row
+         lslb  
+         lslb  
+         addb  <G.KeyFlg  add in the column #
+         cmpb  #$33       ALT
+         bne   L012B
+         inc   <G.AltDwn  ALT down flag
+         ldb   #$04
+         bra   L0108
+L012B    cmpb  #$34       CTRL
+         bne   L0135
+         inc   <G.CntlDn  CTRL down flag
+         ldb   #$02
+         bra   L0108
+L0135    cmpb  #$37       shift key
+         bne   L013F
+         com   <G.ShftDn  shift down flag
+         ldb   #$01
+         bra   L0108
+* check how many key (1-3) are currently being pressed
+L013F    pshs  x
+         leax  <$2D,u     1st key table
+         bsr   L014A
+         puls  x
+         puls  pc,b,a
+L014A    pshs  a
+         lda   ,x
+         bpl   L0156
+         stb   ,x
+         ldb   #$01
+         puls  pc,a
+L0156    lda   $01,x
+         bpl   L0160
+         stb   $01,x
+         ldb   #$02
+         puls  pc,a
+L0160    stb   $02,x
+         ldb   #$03
+         puls  pc,a
+* simlutaneous key test
+L0166    pshs  y,x,b
+         ldb   <G.KTblLC  key table entry#
+         beq   L019D
+         leax  <$2A,u     point to 2nd key table
+         pshs  b
+L0171    leay  <$2D,u     1st key table
+         ldb   #$03
+         lda   ,x         get key#1
+         bmi   L018F      go if invalid? (no key)
+L017A    cmpa  ,y         is it a match?
+         bne   L0184      go if not a matched key
+         clr   ,y
+         com   ,y         set value to $FF
+         bra   L018F
+L0184    leay  $01,y
+         decb  
+         bne   L017A
+         lda   #$FF
+         sta   ,x
+         dec   <G.KTblLC  key table entry#
+L018F    leax  $01,x
+         dec   ,s         column counter
+         bne   L0171
+         leas  $01,s
+         ldb   <G.KTblLC  key table entry (can test for 3 simul keys)
+         beq   L019D
+         bsr   L01C4
+L019D    leax  <$2D,u     1st key table
+         lda   #$03
+L01A2    ldb   ,x+
+         bpl   L01B5
+         deca  
+         bne   L01A2
+         ldb   <G.KTblLc  key table entry (can test for 3 simul keys)
+         beq   L01C0
+         decb  
+         leax  <$2A,u     2nd key table
+         lda   b,x
+         bra   L01BE
+L01B5    tfr   b,a
+         leax  <$2A,u     2nd key table
+         bsr   L014A
+         stb   <G.KTblLC
+L01BE    puls  pc,y,x,b
+L01C0    orcc  #Negative  flag negative
+         puls  pc,y,x,b
+L01C4    leax  <$2A,u
+         bsr   L01CF
+         leax  $01,x
+         bsr   L01CF
+         leax  -$01,x
+L01CF    lda   ,x
+         bpl   L01DB
+         ldb   $01,x
+         bmi   L01DB
+         sta   $01,x
+         stb   ,x
+L01DB    rts   
+* These seem to be special key combination values; 3 per key in ASCII
+*L01DC  fcb     @,shift@,nul
+*	fcb	up,shifted,CTRL
+*	fcb     down, shifted, CTRLed
+*	fcb	left, shifted, CTRLed
+*	fcb	right, shifted, CTRLed
+*	fcb	spacebar, spacebar, spacebar
+*	fcb	’0,’0,$81 signal shiftlock change
+*	fcb	’1,’!,’|
+*	fcb	’2,’”,null
+*	fcb	’3,’#,’~
+*	fcb	’4,’$,null
+*	fcb	’5,’%,null
+*	fcb	’6,’&,null
+*	fcb	’7,’’,’^
+*	fcb	’8,’(,’[
+*	fcb	’9,’),’]
+*	fcb	’:,’*,null
+*	fcb	’;,’+,DEL
+*	fcb	’,,’<,’{
+*	fcb	’-,’=,’_
+*	fcb	’.,’>,’}
+*	fcb	’/,’?,’\
+*	fcb	ENTER,ENTER,ENTER
+* I think these are for ALT
+*	fcb	$82,$83,$84
+*	fcb	ENQ,BREAK,ESC
+* the next I think are for the F1 and F2 keys
+*	fcb	’1,’3,’5
+*	fcb	’2,’4,’6
+L01DC    fdb   $4060,$000c,$1c13,$0a1a,$1208,$1810,$0919,$1120
+         fdb   $2020,$3030,$8131,$217c,$3222,$0033,$237e,$3424
+         fdb   $0035,$2500,$3626,$0037,$275e,$3828,$5b39,$295d
+         fdb   $3a2a,$003b,$2b7f,$2c3c,$7b2d,$3d5f,$2e3e,$7d2f
+         fdb   $3f5c,$0d0d,$0d82,$8384,$0503,$1b31,$3335,$3234
+         fcb   $36
+
+Init           
+Term     clrb  
+         rts   
+
+FuncKeys ldu   <D.CCMem
+         ldx   #PIA0Base
+         clra  
+         ldb   #%11011111 strob column #6 PIA#1
+         stb   $02,x
+         ldb   ,x         read PIA#1
+         bitb  #%01000000 test for F1 function key
+         bne   L0240
+         inca             flag F1
+L0240    ldb   #%10111111 strobe column #7 PIA#1
+         stb   $02,x
+         ldb   ,x         read PIA#1
+         bitb  #%01000000 test for F2 function key
+         bne   L024C
+         ora   #$04       flag F2
+L024C    rts   
+
+         emod  
+eom      equ   *
+         end   
+
+