; Chording Keyboard 'decoder' av Oscar Campbell

PORTA   EQU     $000
PORTB   EQU     $001
PORTC   EQU     $002

DDRA    EQU     $004
DDRB    EQU     $005
DDRC    EQU     $006

RAM     EQU     $10
EPROM   EQU     $80

	ORG     $784
	DB      %00000000
	
	ORG     $7FE
	DW      START

	ORG     RAM     ;..ram..
KEY:            DS      1
TKEY:           DS      1       ; mainloops tempkey
STKEY:          DS      1       ; scans temp key

COLFLAG:        DS      1
TCOLFLAG:       DS      1       ; mainloops temp colflag
STCOLFLAG:      DS      1       ; scans temp colflag

TASCII:         DS      1
TEMP1:          DS      1       ; anv„nds av serut

SHFTFLG:	DS	1	; shift flagga
ALTFLG:		DS	1	; alt flagga
NUMFLG:		DS	1	; numeric flagga


	ORG     $80
KTA:
	DB      ' ntfaks ',2,'   mx          u        r                               '
	DB      'p      h         [                                              '
	DB      '   q                 (                                          '
	DB      '                                                               '
KTB:
	DB      ' iedozg ',1,'   wb          y       ',10,'l                              ',8,''
	DB      'j      c         ]                                             ,'
	DB      '   v                 )                                         ',3,''
	DB      '                                                               '

START:
	CLR     KEY
	CLR     TKEY
	CLR     STKEY
	CLR     COLFLAG
	CLR     TCOLFLAG
	CLR     STCOLFLAG

	CLR	SHFTFLG
	CLR	ALTFLG
	CLR	NUMFLG
; ta bort alla clr's som inte beh”vs sen...

	LDA     #%00000000      ; bara de tre sista som anv„nds...
	STA     DDRC
	LDA     #%11111111
	STA     DDRB
	STA     DDRA
	BSET    0,PORTA


MAIN:
	CLR     TASCII          ; dbg variabeln

	LDA     KEY             ; spar key f”r att j„mf”ra med 'last' senare
	STA     TKEY
	LDA     COLFLAG
	STA     TCOLFLAG        ; f”r att tabell lup ska bli korrekt
	
	JSR     SCAN            ; anropa scan
	
	LDA     KEY
	CMP     TKEY

;       JSR     SPITOUT ;Debug spitout...
	BHS     MAIN            ; bara release om less..

	JSR     SPITOUT         ; 'spotta ut (till ser.)'

FULLRELEASE:            ; V„nta p† att alla tangenter skall sl„ppas
	JSR     SCAN

	LDA     KEY
	CMP     #0      ; j„mf”r med 'inga tangenter'
	BNE     FULLRELEASE

	BRA MAIN




; l„ser in med hj„lp av lowscan och avstudsar..
SCAN:
	JSR     LOWSCAN         ; anropa lowscan
	LDA     KEY
	STA     STKEY           ; lägg keyregister i stkey
	LDA     COLFLAG
	STA     STCOLFLAG       ; lägg keycol.flag i stcolflag

	JSR     TIME

	JSR     LOWSCAN         ; anropa lowscan igen...
	LDA     KEY
	CMP     STKEY           ; jämför key och förra lästa key
	BNE     SCAN            ; om ej lika hoppa till scan, och gör om proceduren
	LDA     COLFLAG
	CMP     STCOLFLAG       ; jämför colflag och förra colflag
	BNE     SCAN            ; om ej lika hoppa till scan, och gör om proceduren
	RTS                     ; annars; key var 'riktig', returnera..

; l„ser endast in kolumner och v„ljer r„tt..
LOWSCAN:
	LDA     #%00000101      ; sätt kol. 2 till aktiv kolumn ("primära kolumnen")
	STA     PORTB
	NOP     ;
	NOP     ;JSR    SWAIT           ; v„nta lite
	LDA     PORTC           ; läs in kolumn
	COM     A               ; negera Acc
	LSL     A               ; lägg det i övre nibble'n..
	LSL     A
	LSL     A
	LSL     A
	STA     KEY             ; lägg i Key

	LDA     #%00000110      ; sätt kol 't' till aktiv
	STA     PORTB
	NOP     ;
	NOP     ; JSR   SWAIT           ; v„ntan?
	LDA     PORTC           ; läs in.
	COM     A
	AND     #%00001111       ; maska bort övre halvan

	TST     A       ; fanns det nåt i col?
	BEQ     COL2    ; annars hoppa till col2..
	ORA     KEY     ; nej, det fanns nåt, vi lägger det i KEY
	STA     KEY
	LDA     #1
	STA     COLFLAG ; sätt flaggan till att col 't' används..
	LDA     #%00000111
	STA     PORTB
	RTS
COL2:
	LDA     #%00000011      ; sätt kol 'h' till aktiv
	STA     PORTB
	NOP     ;
	NOP     ; v„ntan?
	LDA     PORTC           ; läs in.
	COM     A
	AND     #%00001111       ; maska bort övre halvan
	ORA     KEY             ; vi ORar med KEY eftersom vi nu är använd kol (även om vi inte används)
	STA     KEY
	LDA     #0
	STA     COLFLAG         ; sätt flaggan till att col 'h' används..
	LDA     #%00000111      ; †terst„ll till h”gt...
	STA     PORTB
	RTS




SPITOUT:
	LDX     TKEY             ; ladda index reg med TKEY
	TST     TCOLFLAG
	BEQ     TABLEB          ; om colflag = 0, hoppa till tabell A lup
	LDA     KTA,X           ; hämta tecken i tabell B
	BRA     PROCESS         ; hoppa till 'process' nedan
TABLEB:
	LDA     KTB,X           ; hämta tecken i tabell A

PROCESS:
	STA     TASCII


	CMP	#$02	; Alt Gr tangenten?
	BNE	SKIPALT
	LDA	ALTFLG
	INC	A
	STA	ALTFLG
	CMP	#$03	; †terst„ll fr†n locked
	BNE	NOOUT
	LDA	#0
	STA	ALTFLG
	BRA	NOOUT
SKIPALT:
	LDA	ALTFLG		; finns alt flagga
	TST	A
	BEQ	SKPALT2
	AND	#2	; flagga av ifall det inte „r locked
	STA	ALTFLG
	LDA	TASCII
	CMP	#'a'	; a? G”r ett †
	BNE	SKIPAA
	LDA	#229
	STA	TASCII
	BRA	SKPALT2
SKIPAA:
	CMP	#'e'	; e? g”r ett „
	BNE	SKIPAE
	LDA	#228
	STA	TASCII
	BRA	SKPALT2
SKIPAE:
	CMP	#'o'	; o? G”r ett ”
	BNE	SKPALT2
	LDA	#214
	STA	TASCII
SKPALT2:

; kolla shift...
	LDA	TASCII
	CMP	#$01	; Shift key?..
	BNE	SKIPSHFT
	LDA	SHFTFLG
	INC	A
	STA	SHFTFLG
	CMP	#$03	; †terst„ll fr†n locked
	BNE	NOOUT
	LDA	#0
	STA	SHFTFLG
	BRA	NOOUT
SKIPSHFT:
	LDA	SHFTFLG		; finns shift flagga?
	TST	A
	BEQ	SKPSHFT2
	AND	#2	; flagga av, om vi inte „r locked (2)
	STA	SHFTFLG
	LDA	TASCII

	CMP	#'a'
	BLO	NOTALPHA
	CMP	#'z'
	BHI	NOTALPHA
	SUB	#$20	; skifta till capitals
	STA	TASCII
NOTALPHA:
	; andra skift tester... (†, „, ”, ',', ;)
SKPSHFT2:

	JSR	SERUT
NOOUT:
	RTS


SERUT:
	BCLR    0,PORTA         ; Startbit
	JSR     TIME
	LDA     #8
	STA     TEMP1           ; Bitr„knare
SERUT1:
	LSR     TASCII
	BCC     SERUT2
	BSET    0,PORTA
	BRA     SERUT3
SERUT2:
	BCLR    0,PORTA
	BRA     SERUT3
SERUT3:
	JSR     TIME
	DEC     TEMP1
	BNE     SERUT1
	BSET    0,PORTA
	JSR     TIME
	RTS

TIME:
	LDA     #98
	JMP     TIM1
TIM1:
	DEC     A
	BNE     TIM1

	RTS


	END