;:sys36864
	;.opt oo,p
	*= $c000
;
; -----------------------------
; zehnertastatur steuersoftware
; (c) nikolaus heusler  6.92
;     XXXXXXXXXXXX  XX
;     XXXX XXXXXXXX XX
; -----------------------------
;
; **** initialisierung
	lda #<irq
	ldy #>irq	;zeiger auf neue irq-routine
	sei
	sta 788
	sty 789	;irq-vektor setzen
	lda $dd02
	and #%11111011
	sta $dd02	;pa2 auf eingang
	lda #%00001111	;pb4..7 eingang
	sta $dd03	;pb0..3 ausgang
	ldx #0
	stx flag
	stx zust	;variablen loeschen
	inx
	stx count
	stx takt
	lda #16
	sta delay	;verzoegerungszaehler
	lda #255
	sta alt	;keine taste gedrueckt
	cli
	rts	;und fertig
;
; **** bereich fuer variablen
merk	brk	;zwischenspeicher
patt	brk	;reihenmuster
flag	brk	;flag fuer shift (lock)
alt	brk	;alte taste
count	brk	;zaehler fuer repeat
delay	brk	;verzoegerung fuer repeat
zust	brk	;blinkzaehler fuer shift
takt	brk	;blinkverzoegerung
;
; **** hauptprogramm   irq-handler
; diese routine wird mit jedem irq 60 mal in der
; sekunde abgearbeitet
irq	jsr int	;tastatur abfragen
	jsr marke	;ggf. led blinken
	jmp $ea31	;weiter im alten irq
; **** zehnertastatur abfragen
int	lda #0
	sta $dd01	;alle tasten pruefen
	jsr test	;tastatur auslesen
	cmp #%11111
	bne taste	;taste gedrueckt
; keine taste gedrueckt
	lda #16
	sta delay	;repeat nach 16 irqs
	lda #255
	sta alt	;keine taste
	rts	;fertig
; taste gedrueckt
taste	lda #%11110111
	sta patt	;reihe 3 pruefen
	ldx #0	;interne tastennummer
keyloop	lda patt
	sta $dd01	;reihe auf low
	jsr test	;spalten pruefen
	ldy #5	;fuenf spalten
schieb	lsr
	bcc press	;low, dann tastendruck
	inx	;naechste taste
	dey
	bne schieb	;naechste spalte
	sec
	ror patt
	bcs keyloop	;naechste reihe
	rts	;stoerung
; tastendruck erkannt
press	cpx #14
	beq sonder	;shift-taste
	cpx alt	;selbe taste
	bne neu	;nein, weiter
	ldy delay
	beq darf	;repeat schon aktiv
	dec delay
	bne full	;repeat verzoegern
darf	dec count
	bne full	;repeat-schnelligkeit
	ldy #4
	sty count	;geschwindigkeit
neu	ldy flag
	beq asc0	;ungeshiftet
	lda ascii+20,x
	jmp eval
asc0	lda ascii,x	;ascii-code lesen
eval	cmp #248
	bcs function	;funktionstaste
buff	ldy 198	;anzahl gespeicherter tasten
	cpy $289
	bcs full	;tastaturpuffer voll
	sta $277,y
	inc 198	;taste speichern
	lda flag	;shift-flag
	and #2
	bne full	;shift lock
	lda #0
	sta flag	;sonst shift loeschen
full	stx alt
	rts	;und fertig
; shift-taste
sonder	cpx alt
	beq full	;zweimal hintereinander
	ldy flag
	iny	;flag erhoehen
	cpy #4
	bcs zero	;dritte betaetigung
	cpy #2
	bne eins	;zweite betaetigung
	ldy #3
	.byt $2c	;shift lock ein
zero	ldy #0	;shift aus
eins	sty flag
	jmp full	;und fertig
; tabelle zur umrechnung der tastennummer
; in den ascii-code
ascii	.byte "13c2f46b5e"
	.byt 20,13	;del, return
	.byte ".0?79a8d"
	.byt 255,255,249,17,252,157,29,250,255,253
	.byt 148,248,32,44,0,19,255,251,145,254
; funktionstaste auswerten
function	bne wort	;befehlswort
; escape-funktion
	ldy #0
	sty $c7	;revers-modus loeschen
	sty $d4	;quote-modus loeschen
	sty $d8	;insert-modus loeschen
	sty flag	;shift loeschen
	jmp full	;getan
wort	sbc #249
	sta merk	;ergibt token-nummer
	ldy #-1	;beim ersten byte beginnen
wo1	dec merk	;token gefunden
	bmi found	;ja, dann ausgeben
wo2	iny
	lda words,y	;beginn des tokens suchen
	bpl wo2	;token ueberlesen
	bmi wo1	;naechstes token gefunden
found	iny
	lda words,y	;token ausgeben
	bmi wo3	;token beendet
	sty merk
	jsr buff
	ldy merk	;zeichen ausgeben
	bpl found	;und weiter
wo3	and #127	;ende-marke loeschen
	jmp buff	;letztes zeichen ausgeben
; tabelle der vorgabe-befehlswoerter
; letztes zeichen jew. markiert
; durch gesetztes bit 7
words	.byte "load"
	.byt 34+128	;anfuehrungszeichen
	.byte "inpuTprinTdatAlisTruN"
	.byt 128	;ende-flag
; led einschalten, wenn tastatur aktiv
; blinken, wenn shift (lock) aktiv
marke	lda flag	;shift-flag
	bne inhalt	;shift aktiv
set	sta $dd01	;led dauerlicht
	rts	;fertig
; led soll blinken
inhalt	dec takt	;blinktakt
	bne normal	;verzoegerung
	lda #8	;blinkgeschwindigkeit
	sta takt	;setzen
	lda zust	;led-bit
	eor #2	;umdrehen
	sta zust	;und speichern
normal	lda zust	;led mit zustand
	bpl set	;beaufschlagen
; **** tastatur-spalten auslesen
test	lda $dd00
	and #4
	sta merk	;pa2 lesen
	lda $dd00
	and #4
	cmp merk
	bne test	;pa2 entprellen
	lsr
	lsr
	lsr
	php	;ins carry schieben und retten
lies	lda $dd01	;pb4..7 lesen
	cmp $dd01
	bne lies	;und entprellen
	lsr
	lsr
	lsr
	lsr	;nach bit 0..3 schieben
	plp
	rol	;plus pa2 nach bitposition 0
	rts	;fertig
; -------- ende --------
