INCLUDE EQMON Appel des equates SECT GETCH EXTERN BRASHI TTL MONITEUR MO5: LECTURE DU CLAVIER, VERSION 6809 * ***** VERSION HARD MO5 * ******************************************************************************* * * * Decodage du clavier avec autorepeat des touches. SHIFT appelle le code * * superieur de la touche. CONTROL force le bit 6 a zero. BASIC renvoie le * * code numerique avec bit 7 force a 1. CONTROL, BASIC ou SHIFT seuls sont * * ignores ainsi qu'une combinaison de ces touches. Le caractere se trouve * * dans B. B = 0 signifie qu'aucune touche n'est enfoncee. * * KEYTST est un test rapide des touches qui retourne avec : * * Z=1 B=$34 (PAS DE TOUCHE ENFONCEE) * * Z=0 B=NUMERO PHYSIOUE DE TOUCHE (UNE TOUCHE ENFONCEE) * * Les registres utilises sont STATUS : (Bit7 = maj/min, Bit2 = flag auto- * * repeat; CMPTKB = compteur it clavier; KEY = lecture precedente ( a zero * * si aucune touche n'a ete enfoncee ); * * * ******************************************************************************* * ***** CONTROLE RAPIDE DES TOUCHES ET DEMATRICAGE DU CLAVIER * INTERN KEYTST * KEYTST EQU * LDD BLOCZ BLOCZ = 0000. STD TEMP Flag pour les touches Basic, Control et Shift. LDB #%01110010 Position de la derniere touche clavier (BASIC) KBSCAN EQU * STB PRB-PRA,U Envoi du code position de la touche LDA PRB-PRA,U Out clavier (bit7=0 ==> touche enfoncee). BMI NXTKEY NXTKEY : test de la touche suivante. LDA #1 On va donc tester si BASIC,CTRL,SHIFT CMPB #%01110010 BAS1C ? Flag=l BEQ SAVFLG LSLA Flag control = 2 CMPB #%01101010 Control ? BEQ SAVFLG Oui, idem LSLA Flag shift = 4 CMPB #%01110000 Shift ? BNE EXREAD Non, c'est une autre touche du clavier. SAVFLG EQU * STA TEMP Positionne le flag.(Prior:CTRL,SHIFT,BASIC). NXTKEY EQU * INC TEMP+1 Touche suivante. SUBB #2 Envoi code touche suivante :codes de 2 en 2. BPL KBSCAN Sortie si aucune touche enfoncee. EXREAD EQU * LDD TEMP A = flag, B = numero de la touche dans TABASC STD 3,S Sauvegarde dans la pile pour les appelants. CMPB #$3A Z = 1 si pas de touche enfoncee. RTS * ***** NOYAU DE LA ROUTINE * INTERN GETCH GETCH EQU * TST SS3GET SS3GET est un flag de 3eme appel a GETCH dans les BNE MINACC sequences a 2 touches (contient le code minus.) CALL KTST CONFRM EQU * PSHS D Premiere lecture LDX #625 Anti-rebond de 5 Msec. = 625 * 8 Usec. WAIT EQU * LEAX -1,X BNE WAIT CALL KTST Relecture pour confirmation. CMPD ,S++ Meme touche ? BNE CONFRM Non ! On recommence... CMPB #$3A B contient le code de la touche. BEQ EXITER CMPB KEY Est-ce toujours la meme touche ? BNE NEWKEY Non : donc pas de repetition possible. LDA CMPTKB CMPA LATCLV Repeat apres LATCLV*l/10 SEC. BLO EXIT01 CMPTKB incremente dans le traitement IRQ. LDA #02 Masque bit 1 de STATUS BITA STATUS Bitl = 1 ==> trop rapide, ne pas repeter. BNE EXIT01 JSR BRASHI DRA avec STATUS , STA STATUS et RTS. SKIP2 NEWKEY EQU * CLR CMPTKB Reset du compteur de touches. STB KEY B = code numerique. CALL BIIP Beep clavier. LSR TEMP Bit0 de TEMP = flag BASIC --> carry. BCC CONTRL C'est peut-etre une touche control. ORB #$80 Code numerique et Bit7 force a 1. BRA EXITOK MINACC EQU * LDB SS3GET Envoi de la minuscule sauvegardee au 2eme appel CLRA BRA STASS3 A --> SS3GET et sortie generale. EXITER EQU * CLR KEY Pas de touche mais n'efface pas EXIT01 EQU * la touche Accent precedente. CLRB BRA EXIT CONTRL EQU * LDX CHRPTR Pointeur sur la table de decodage. LDB B,X Transcodage en ASCII par la table. LSR TEMP Bit1 de TEMP = flag CONTROL --> carry. BCC SHIFT C'est peut-etre une touche shift. ANDB #$BF Bit6 force a zero si control. BRA CTRLVE SHIFT EQU * LSR TEMP Bit2 de TEMP = flag SHIFT --> carry. BCC ONEKEY Une seule touche enfoncee,"normale". CMPB #SP BLO EXITOK Les codes < $20 ignorent le shift. BNE NONINV Shift-sp est le passage maj/min. LDA #$80 Bit7 de STATUS = majuscule/minuscule. EORA STATUS Bit7 complemente. STA STATUS CLRB BRA EXITOK NONINV EQU * CMPB #$2F Entre $21 et $2F, forcer Bit4 a 1. BGT SUPA2F ORB #$10 BRA EXITOK Il ne peut s'agir d'un accent. SUPA2F EQU * CMPB #$39 Entre $30 et $39, forcer Bit4 a 0 (dans ce cas le BGT SUPA39 SHIFT/0 sans sequence accent donne l'espace}. ANDB #$EF BRA TSTSS2 C'est peut etre un accent aigu, grave ou trema. SUPA39 EQU * CMPB #$40 $40 = code de @. BNE EXITOK Shift/lettre --> majuscule. LDB #$5E $5E = code de ^ = shift/@. BRA TSTSS2 C'est peut-etre l'accent circonflexe. ONEKEY EQU * CMPB #$41 $41 : code du A. BLO TSTSS2 Si code du zero,c'est peut-etre l'accent grave. LDA STATUS Test majuscule/minuscule. BPL EXITOK Bit7 = 0 ==> majuscule, donc on sort. ADDB #$20 Code minuscule = code majuscule + $20. TSTSS2 EQU * TST SS2GET BEQ CTRLVE SS2GET non nul ==> sequence accent. LDA #$0B Compteur dans la table d'accents NXTACC EQU * DECA BEQ EXITOK LEAX -3,X CMPB ,X Code generant un accent ou une min. accentuee? BNE NXTACC On passe au code suivant LDD 1,X Dans B le code de l'accent et dans A le code de STASS3 EQU * la minuscule sauvegarde dans SS3GET. STA SS3GET EXITOK EQU * CLR SS2GET lncompatibilite avec sequence accent. EXIT EQU * STB 4,S Resultat dans la pile. RTS CTRLVE EQU * CMPB #SS2 La touche enfoncee est-elle la touche accent? BNE EXITOK Si non, sortie normale. INC SS2GET On positionne SS2GET pour les codes a venir. BRA EXIT * ***** TABLE DE CORRESPONDANCE MINUSCULES ACCENTUEES OU ACCENTS * FCB $30,$61,$41 a accent grave vient du chiffre 0 FCB $36,$65,$42 e accent aigu vient du chiffre 6 FCB $37,$65,$41 e accent grave vient du chiffre 7 FCB $38,$75,$41 u accent grave vient du chiffre B FCB $39,$63,$4B c cedille vient du chiffre 9 INTERN TABSS2 TABSS2 EQU * FCB $63,$00,$4B Cedille.(vient de c min. $43 transforme en $63) FCB $20,$00,$41 Grave.(vient de shift/0=$30 transforme en $20) FCB $27,$00,$42 Aigu.(vient de shift/7 $37 transforme en $27) FCB $5E,$00,$43 Circonflexe.(vient de shift/@ $40 --> $5E) FCB $22,$00,$48 Trema.(vient de shift/" $32 transforme en $22) INTERN TABASC TABASC EQU * FCB $00 n^$0 BASIC FCB $00 n^$1 SHIFT FCB $02 n^$2 STOP instr FCB $16 n^$3 SS2 inkey$ FCB $00 n^$4 CONTROL FCB $0D n^$5 CR FCB $0C n^$6 FF cls FCB $43 n^$7 C console FCB $0B n^$8 VT cont FCB $57 n^$9 W fre FCB $31 n^$A 1 ! gr$ FCB $2B n^$B + ; restore FCB $41 n^$C A attrb FCB $2A n^$D * : play FCB $51 n^$E Q return FCB $56 n^$F V line FCB $08 n^$10 BS tron FCB $58 n^$11 X exec FCB $32 n^$12 2 " left$ FCB $2D n^$13 - = data FCB $5A n^$14 Z locate FCB $2F n^$15 / ? print FCB $53 n^$16 S screen FCB $42 n^$17 B box FCB $0A n^$18 LF skipf FCB $20 n^$19 SP FCB $33 n^$1A 3 # mid$ FCB $30 n^$1B 0 SP read FCB $45 n^$1C E else FCB $50 n^$1D P pset FCB $44 n^$1E D delete FCB $4D n^$1F M motor FCB $09 n^$20 HT troff FCB $40 n^$21 @ ^ poke FCB $34 n^$22 4 $ right$ FCB $39 n^$23 9 ) strig FCB $52 n^$24 R run FCB $4F n^$25 O on FCB $46 n^$26 F for FCB $4C n^$27 L list FCB $1E n^$28 RS merge FCB $2E n^$29 . > peek FCB $35 n^$2A 5 % input FCB $38 n^$2B 8 ( stick FCB $54 n^$2C T to FCB $49 n^$2D I if FCB $47 n^$2E G go FCB $4B n^$2F K rnd FCB $1C n^$30 INS load FCB $2C n^$31 , < clear FCB $36 n^$32 6 & inpen FCB $37 n^$33 7 ' ptrig FCB $59 n^$34 Y step FCB $55 n^$35 U dim FCB $48 n^$36 H sub FCB $4A n^$37 J then FCB $1D n^$38 EFF save FCB $4E n^$39 N next END