;:sys36864 ;.opt oo,p *= $c000 ; ; ----------------------------- ; zehnertastatur steuersoftware ; (c) nikolaus heusler 6.92 ; XXXXXXXXXXXX XX ; XXXX XXXXXXXX XX ; ----------------------------- ; ; **** initialisierung lda #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 --------