INCLUDE EQMON Appel des equates SECT GETSCR TTL MONITEUR MO5: PRIMITIVE GETSC * ***** VERSION HARD MO5 * ************************************************************************** * G E T S C * Routine donnant dans B le code ASCII du caractere pointe par * les coordonnees : RANG [0,24] dans le registre A * COLONNE [1,40] dans le registre X * * En sortie : * * caractere non accentue : * Dans B, code ASCII du caractere (0 si caractere inexistant) * * * caractere accentue : * 3 appels sont alors necessaires. * 1er appel : on detecte un caractere accentue. On * renvoie SS2 ($16) dans B: le code ASCII de I'accent est * mis dans SS3GET et le code ASCII de la minuscule dans * SS2GET. * 2eme appel : on renvoie dans B le code ASCII de * l'accent et l'on met $80 dans SS3GET. SS2GET est inchange. * (contient toujours le code de la minuscule). * 3eme appel : on renvoie dans B le code de la * minuscule accentuee. SS3GET et SS2GET sont remis a zero * ************************************************************************** INTERN GETSC GETSC EQU * LDB STATUS Sauvegarde de l'etat courant du curseur, PSHS B car la trace du curseur peut empecher de LDB #DC4 reconnaitre un caractere. On l'arrete. CALL PUTC Simulation de JSR PUTCH. TST SS3GET SS3GET = 0 : cas normal BGT EXIT02 Sortie apres 2eme appel. (code accent --> B) BMI EXIT03 Sortie apres 3eme appel. (code min. --> B) LDB #$1F $1F = code ASCll du SPACE -1. STB 5,S Dans B sur la pile. BSR ADRPHY D = RANG * 320 + CURSOR ADDB 8,S + X low (COLONNE) TFR D,U L'appel a curseur on nous a mis en mem. point LDX GENPTR Test caractere "normal"; X pointe sur TABAF. LDD #$6108 Nombre d'octets a tester = 8 et Nombre d'entrees = 97 BSR COMPAR Comparaison des 8 octets. BCS TSTCED Coincidence trouvee: tester si c'est la cedille LEAX 6,X Pour "sauter" les 6 octets inferieurs. LEAU -240,U Pour pointer les deux octets sup. du caractere. LSR 5,S En arrivant ici, B (pile)= $80 devient $40. LDD #$402 Nombre d'octets a tester = 2 et 4 accents. BSR COMPAR Comparaison des 2 octets superieurs. BCC NOCHAR Sortie caractere non reconnu ( 0 --> B ). LDB 5,S Code ASCII de l'accent trouve en sortie. CMPB #$44 On a S44 si c'est le dernier accent (trema) BNE OKCODE Les codes se suivent sauf pour le trema dont LDB #$48 le code est $48. Pourquoi faire simple... OKCODE EQU * STB SS3GET Le code doit se trouver dans SS3GET. LDB #$60 Code du a minuscule -l, dans SS2GET qui sera STB 5,S incremente a chaque comparaison. LDX GENPTR X pointe en debut de la table des minuscules. LEAX 520,X Relatif a GENPTR pour translation de TABAF LEAU 240,U Pour pointer en bas du caractere dans l'ecran. LDD #$1B06 Nombre d'octets a tester = 6 et 27 minuscules. BSR COMPAR Comparaison des 6 octets inferieurs. BCS MINACC MINACC : minuscule trouvee. LDB #$20 Minuscule accentuee non trouvee ==> SPACE SKIP2 MINACC EQU * LDB 5,S Code de l'accent STB SS2GET LDB #$16 Code du SS2 STB 5,S BRA RESTAT SS2GET et SS3GET sont deja positionnes. TSTCED EQU * TST 5,S Test du code du caractere dans B (dans la pile) BPL EXIT01 Si code < $80 (b7=0). caractere "normal" LDB #$16 Code de SS2. STB 5,S LDD #$4B63 Code de la cedille et du c minuscule. BRA OUTSCR EXIT02 EQU * LDB SS3GET Envoi du code de l'accent. STB 5,S Dans dans la pile. LDA #$80 Flag de fin de 2eme appel. BRA FLAG02 EXIT03 EQU * LDA SS2GET Envoi du code de la minuscule. NOCHAR EQU * STA 5,S On arrive ici avec =0 si apres comparaison. EXIT01 EQU * LDD BLOCZ OUTSCR EQU * STB SS2GET FLAG02 EQU * STA SS3GET RESTAT EQU * PULS A STA STATUS Remise du curseur dans l'etat initial. RTS * ***** RECHERCHE DE LA POSITION DU CARACTERE EN MEMOIRE FORME * ADRPHY EQU * LDB #160 ADRPHY est aussi appele dans PUTCH. MUL D = RANG*160 ASLB LSLD : 0 = RANG*320 ROLA ADDD #CURSOR-1 CURSOR = adresse pointeur cureur RTS * ***** COMPARAISON ENTRE LES OCTETS DU GENERATEUR ET L'ECRAN * * avec: X parcourt les octets du generateur * U parcourt les octets du caractere * B nombre d'octets a tester COMPAR EQU * PSHS X,U,D Sauvegarde pointeur bas caractere et generateur NXTBYT EQU * LDA ,X+ CMPA ,U BNE DIFFER LEAU -40,U On remonte d'une ligne dans l'ecran. DECB Decrement du compteur. BNE NXTBYT Test passage par zero pour test octet suivant. COMA Coincidence de tous les octets : set carry. SKIP1 DIFFER EQU * CLRA Pas de coincidence : clear carry. PULS X,U,D Restauration pointeurs ecran et generateur, INC 7,S Inc code ASCII caractere (carry inchanqee) LEAX 8,X Pour pointer sur le caractere suivant dans BCS EXITCP le generateur. DECA Si non fini, essaie une autre entree. BNE COMPAR EXITCP EQU * RTS END