INCLUDE EQMON TTL MONITEUR MO5: CONTROLE ALPHANUMERIQUE DE L'ECRAN SECT PUTCH EXTERN ADRPHY,TABAF,TABASC * ***** VERSION HARD MO5 * ****************************************************************************** * PUTCH est la routine de controle alphanumerique de l'ecran. Le parametre * affichable ou interpretable est passe par l'accumulateur B. Les caracte- * ristiques sont decrites dans un document separe. Les registres utilises * sont les suivants : * SEQUCE : flags de sequences interpretables, positionnes a 1 par le 1er * caractere de la sequence et remis a 0 quand la sequence est in- * terpretee - 0 : NORMAL, 2 = ESCAPE, 4 = UNIT SEPARATOR, 6 = SSZ * ATRANG: Bit7: plein ecran, Bit2 = largeur, Bitl = hauteur. * SCRPT : adresse physique du curseur [STAD,ENOAO-1]o * RANG : rangee logique du curseur [0,24] * COLN : colonne logique du curseur [1,40] * STADR : adresse physique du sommet de la fenetre affichable * ENDDR : adresse physique + 1 de la fin de la fenetre affichable * TOPRAN : rangee logique du sommet de la fenetre >= 0 * BOTRAN : rangee logique du bas de la fenetre <= 24 * USERAF : pointeur sur l'origine du qenerateur de caractere utilisateur * COLOUR : couleur courante [P.B.V.R.P.B.V.R] fond en poids faible * PAGFLG : flag de mode - 0 : mode scroll, page sinon. * STATUS : status composite - Bit7 = inutilise, Bit6 = rollup/ * down rapide, Bit2 = visualisation du curseur, les autres bits * sont utilises par d'autres routines systeme. * COPCHR : a $FF, indique que BS et HT doivent faire une recopie a droite * ou a gauche du caractere courant. * CURSFL : flag de mouvement curseur indiquant si l'on sort d'une ligne * par un mouvement curseur ou par un caractere affichable (dans * ce cas la ligne est logiquemnt liee a la suivante et le * terminateur correspondant est a $FF) * US1 : stockage temporaire du ler parametre des sequences a deux parame- * tres. * SAVEST : reqistre temporaire de sauvegarde du pointeur S * TEMP : registre de travail temporaire * COPCHR : flag de copie par HT et BS * CURSFL : flag de HT empechant la pose d'un lien * ******************************************************************************** * ***** NOYAU DE PUTCH * INTERN PUTCH PUTCH EQU * ORCC #%11010000 Fermeture des IT et set du bit E . JSR FORME1 Mise en memoire caractere. LDX #TABSEQ LDA SEQUCE SEQUCE:0=normal,2=escape,4=unit separator,6=SS2 JSR [A,X] CLR COPCHR Reset automatique du flag de copie par BS et HT CLR CURSFL Reset automatique du flag de HT empechant la * pose d'un lien EXIT EQU * RTS Retour dans SWITCH. * ***** SEQUENCE NORMALE D'INTERPRETATION * NORMAL EQU * CMPB #SP Affichable ? BHS CHDIS Oui : routine principale d'affichaqe. CMPB #BEL Interpretable ? BLO EXIT Non : retour par EXIT. CLRA Pour une eventuelle sequence. LSLB B = B * 2 (adresses sur deux octets) LDX #TABDEC-2*BEL TABDEC = table des points d'entree des JMP [B,X] codes interpretables. * ***** DECODAGE SEQUENCE SS2 (CEDILLE ET ACCENTS) * SS2EX EQU * CLR SEQUCE CMPB #$4B Cedille ? BEQ CCDILL LDA #2 Servira de flag et d'indicateur qu'il STA ACCENT n'y a que 2 octets a ecrire. LSLA A = 4 = nombre d'accents a tester. LDX CHRPTR On commence oar la fin de la table d'accents: NXTACC EQU * debut de la table de decodage dans GETCH. LEAX -3,X CMPB 2,X Recherche du code ASCII dans la table d'accents BEQ ENVOI Si on le trouve... DECA A est le compteur de tests et l'offset dans la BNE NXTACC table des accents. SKIP2 A = 0 si l'on arrive par ici. CCDILL EQU * LDA #$80 Code de la cedille dans ACCENT STA ACCENT En venant de la cedille, ACCENT = $80, 0 sinon. RTS ENVOI EQU * TFR A,B B = N^ accent = offset dans TABG2 (de 1 a 4) ORB #%10000000 Bit7 a 1 pour un offset de $81 a $84 dans TABAF. BRA DISP01 Branchement a la routine principale d'affichaqe TTL ROUTINE D'AFFICHAGE * ***** ROUTINE PRINCIPALE D'AFFICHAGE * CHDIS EQU * CLR COPCHR Afin d'eviter la copie sur entree de caractere TST ACCENT BMI CEDILL ACCENT = $80 ==> cedille. BEQ NONACC ACCENT = $00 ==> caractere non accentue. CMPB #$61 Minuscule? BHS DISP01 OK, le caractere accentue est une minuscule. CHOUT EQU * CLR ACCENT Sinon on ignore la sequence. NONACC EQU * TSTB Test caractere utilisateur ou non. BPL DISP01 B <= $7F ==> caractere standard. LDU USERAF Pointe sur le generateur de car. utilisateur. SUBB #$80 Pour se ramener entre 0 et $7F dans la table. BRA DISP02 CEDILL EQU * CMPB #$63 c minuscule ? BNE CHOUT Exit si c'est un autre caractere. LDB ACCENT $80 = code cedille dans B. CLR ACCENT Reset de accent car 8 octets a afficher. DISP01 EQU * LDU GENPTR Pointe sur le generateur de caracteres standard. SUBB #SP La table commence au "SP". DISP02 EQU * LDA #8 Calcul de l'offset dans la table : 8 octets MUL par caractere, donc on multiplie par 8 LEAU D,U D pointe sur le 1er octet du caractere. CLR EFCMPT Pour eviter des traces intempestives de curseur LDY SCRPT Pointeur d'ecran courant. LDB ATRANG Test de la taille du caractere. ANDB #3 B=0 ==> Taille normale (CY=O) ou double hauteur LSRB (CY=1); B=1 ==> Double taille (CY=1) ou double BNE TDOUB largeur (CY=0) TTL AFFICHAGE SIMPLE ET DOUBLE TAILLE * ***** TAILLE NORMALE ET DOUBLE HAUTEUR * BSR ACCENP Test presence accent COPY EQU * PULU A A=octet caractere U pointe au sommet de la table BSR STAY Affichage de l'octet Y =SCRPT BCC NORSIZ La carry n'a pas ete modifiee depuis l'appel. BSR STAY Affichage sur 2 lignes en double hauteur NORSIZ EQU * DECB B contient le nombre d'octets du caractere (6 ou 8) BNE COPY BSR COLTRT A et B = couleur, X=8 ou 16 en sortie: compteur COPY02 EQU * BSR STAY Affichage en memoire couleur. LEAX -1,X Decrement de X = compteur d'octets a afficher. BNE COPY02 BRA TSTACC En sortie B=0, A=couleur, Y=sommet du caractere * ***** AFFICHAGE SIMPLE OU DOUBLE EN MEMOIRE ECRAN * STDY EQU * STB 1,Y Point d'entree sur deux octets "de large" STAY EQU * STA ,Y Point d'entree sur un octet de large. LEAY -INTERL,Y Remontee a l'octet au-dessus dans l'ecran. RTS * ***** DOUBLE TAILLE ET DOUBLE LARGEUR * TDOUB EQU * BSR ACCENP Test accent en sortie B contient 6 ou 8 LCPY EQU * PULU A PSHS B,CC CC sauvegarde car EXPAND detruit la carry STA TEMP Expansion: A=76543210 --> D=7766554433221100 LDD #$8000 Le passage du 1 dans la carry arretera EXPAND EQU * l'expansion. LSR TEMP RORA RORB ASRA Rused ! !! ! RORB BCC EXPAND Test passage du bit positionne dans D au depart PULS CC On recupere CC pour tester la double taille ou BSR STDY la double larqeur. BCC LDOUB Un seul affichage en double largeur. BSR STDY Deux en double taille. LDOUB EQU * PULS B Restauration contenu B DECB BNE LCPY BSR COLTRT Preparation traitement couleur. LCPY02 EQU * BSR STDY Affichage en double larqeur de la couleur, si LEAX -$01,X X=8 simple hauteur, si X=16 double hauteur. BNE LCPY02 SKIP2 TRTOUT EQU * LEAS 2,S Point d'entree en revenant de COLTRT. TSTACC EQU * TST ACCENT Test affichage accent pour saut ou non curseur. BEQ NXTPOS Saut curseur si non accent. RTS Retour direct si saut curseur supprime. * ***** TRAITEMENT ACCENT ***** * ACCENP EQU * LDB #8 Caractere non accentue : 8 octets a afficher TST ACCENT BEQ OUTACC ACCENT=0 caractere non accentue DEC ACCENT ACCENT prend la valeur 0 ou 1. BNE OUTACC ACCENT=1 impression caractere accent B=8 DECB ACCENT=0 impression caractere accentue B=6 DECB OUTACC EQU * RTS * ***** CANCEL * CANCEL EQU * LDU COLOUR Sauve COLOUR et PAGFLG sur 16 bits. LDX SCRPT On protege COLOUR des effets du mode page LDY RANG LDA ATRANG On protege les attributs de taille des effets du mode page. LDB #$FF des attributs de couleur et de taille. STB PAGFLG Protection contre les rollups CANNX EQU * LDB #SP CALL PUTC Appel recursif pour garantir l'integrite de * l'ecran et des registres ,, et , * au prix d'une perte de vitesse. LDB COLN CMPB #1 Arrive au debut de la ligne suivante? BNE CANNX STU COLOUR Restaure COLOUR et PAGFLG STX SCRPT STY RANG RANG et COLN restaures sur 16 bits. STA ATRANG FFTERM EQU * LDA #$FF Pose d'un terminateur puisque la fin de la ligne STA [TABPT] a ete detruite. RTS * ***** PREPARATION DU TRAITEMENT COULEUR * COLTRT EQU * LDX #8 X : compteur d'octets couleur a affioher en BCC BYTES8 hauteur. LEAX $08,X La carry = 1 ==> double hauteur ==> X=16. BYTES8 EQU * LDA #$40 ANDA STATUS Test du mode rapide : si oui, retour direct BNE TRTOUT au programme appelant les routines de taille. LDY SCRPT Pointeur d'ecran en bas du caractere 8x8. MEMCOL EQU * JSR FORME0 Passage en memoire couleur. LDACOL EQU * LDA COLOUR LDB COLOUR Eventuellement pour la double larqeur RTS On va traiter la couleur. NXTPOS EQU * LDA ATRANG Traitement du saut curseur. BITA #2 Test de la double largeur. BEQ ONELGR En simple larqeur on n'avance que d'une "case" INC COLN En double largeur, on incremente une 1ere fois INC SCRPT+1 la colonne et le pointeur d'ecran. Refait ONELGR EQU * dans HORT : increment COLN et curseur. BRA HORT TTL CODES INTERPRETABLES * ***** CURSEUR OFF * CURSOF EQU * BSR EFFCUR Extinction curseur. LDA #%11111011 Bit 2 de STATUS a zero. SKIP2 * ***** ROLLUP ET ROLLDOWN RAPIDES * ROLNOR EQU * LDA #%10111111 Ecriture caractere et couleur. ANDA STATUS Mise a zero du bit 6 de STATUS et sortie BRA BRASHO ROLFST EQU * LDA #%01000000 Ecriture caractere seul. INTERN BRASHI BRASHI EQU * ORA STATUS BRASHO EQU * STA STATUS RTS * ***** CURSEUR ON * CURSON EQU * LDA 4,S CC sur la pile. ANDA #%11101111 Ouverture des IT sur la pile. STA 4,S INTERN CURSIN Appelle dans la routine d'initialisation. CURSIN EQU * LDA #%00000100 Bit7 de STATUS = autorisation IT BRA BRASHI curseur. * ***** EFFACEMENT DU CURSEUR * INTERN EFFCUR EFFCUR EQU * LDA STATUS BITA #%00000100 Si curseur off,sauter la routine. BEQ EFFOUT TST EFCMPT Nombre pair de complements curseur ? BEQ EFFOUT Si oui rien de special a faire. JSR FORME1 Mise en memoire caractere. INTERN COMCUR Appele dans LIGHT {KBINT2). COMCUR EQU * COM [SCRPT] Inversion du curseur qui etait allume. COM EFCMPT Inversion compteur d'inversions curseur. EFFOUT EQU * RTS * ***** CARRIAGE RETURN * CARRET EQU * BSR EFFCUR Reset curseur dans un etat connu : eteint. CLR COLN Colonne logique a 1 : debut de ligne. INC COLN BSR JMPCAL Calcul du curseur a partir de RANG et COLN range dans SCRPT. BRA FFTERM Pose d'un terminateur de ligne et RTS * ***** LINE FEED * LINFED EQU * BSR EFFCUR Reset curseur dans un etat connu : eteint. INC RANG Increment rangee logique car descente LDA RANG d'une ligne. CMPA BOTRAN En bas de la fenetre ? BLS JMPCAL Calcul du curseur a partir de RANG et COLN CLRB Pour eviter un double LF en double hauteur. BRA LFFNR Traitement en cas de scroll. * ***** RECORD SEPARATOR * RECSEP EQU * BSR EFFCUR EFCNT EQU * CLR COLN Point d'entree en venant de Form Feed, INC COLN Colonne la plus a gauche ==> COLN=1, et BRA RETHT positionnement en 1ere ligne (RETHT]. * ***** HORIZONTAL TABULATION * HORTAB EQU * BSR DPLCUR Pour deplacement curseur. LDA #$FF STA CURSFL Flag empechant la pose de lien HORT EQU * INC COLN Point d'entree de VT.Apres VT,CURSFL=$FF pour * eviter la pose d'un lien, X=SCRPT et B=8 au cas * ou il s'agit d'une recopie a droite signalee LDA COLN par COPCHR=$FF CMPA #41 Fin normale d'une colonne. BEQ FNRANG CMPA #42 Fin d'une colonne double larqeur mal cadree. BEQ FNDWDT TST COPCHR Flag de copie d'un caractere,en venant de HT. BEQ HTNOR LEAY 1,X Recopie a droite du caractere courant. BSR COPYCH HTNOR EQU * INC SCRPT+1 RTS DPLCUR EQU * BSR EFFCUR DPLCUR appele en HORTAB ou en BACKSP. LDX SCRPT Au cas ou il y aurait l'option copie. LDB #8 RTS FNDWDT EQU * DEC SCRPT+1 Ramener a la derniere colonne. FNRANG EQU * TST COPCHR Flaq d'option copie associe a HT. BEQ FNNOR LEAY 7*INTERL+1,X Recopie au debut de la ligne suivante. BSR COPYCH FNNOR EQU * LDD #$0101 A=1 pour COLN,B=1 pour faire un ET avec ATRANG. STA COLN Colonne compte de 1 a 40 TST CURSFL Arrive-t-on de horizontal tabulation? BMI LFFNR Auquel cas on ne pose pas de lien avec la ligne LDX TABPT suivante. BITB ATRANG Traitement terminateurs double hauteur. BEQ LIENOR CLR -1,X Pose terminateur ligne precedente si double hauteur LIENOR EQU * CLR ,X Pose terminateur ligne en cours. LFFNR EQU * ANDB ATRANG B=0: normal; entree de LF avec B=0 LSLB LSLB LSLB B=8 : double hauteur. LDX #SSIZE Table des interlignes divers, pour # tailles. ABX X pointe sur SSIZE ou DSIZE suivant la taille LDA RANG passee par B. ADDA ,X 1 ou 2 STA RANG CMPA BOTRAN Bas de la fenetre ? BLS JMPCAL Calcul de SCRPT a partir de RANG et COLN. TST PAGFLG Test de mode page pour faire ou non un scroll. BEQ ROLLUP PAGFLG # FF et bas de fenetre ==> scroll. RETHT EQU * LDA TOPRAN Sinon, pas de scroll, RANG prend la valeur OUTHT EQU * du haut de fenetre. STA RANG JMPCAL EQU * JMP SCRCAL CalcuI SCRPT et RTS. ROLLUP EQU * STX TEMP Sauvegarde de X utilise dans scroll ligne LDB ,X TBPL1 EQU * LDY TOPTAB On lit le sommet logique de la table des terminateurs TBPL0 EQU * CMPY BOTTAB Fini?? BHS OUTTB LDA 1,Y On lit la ligne suivante, STA ,Y+ que l'on recopie sur la ligne presente,puis BRA TBPL0 l'on descend d'une ligne. OUTTB EQU * LDA #$FF Pose d'un nouveau terminateur dans la nouvelle STA ,Y ligne. DECB Rollup simple ou double ? BNE TBPL1 LDA ,X 1 ou 2 multiplie par 8 pour le nombre de LSLA rollups LSLA LSLA LDX #ROLL a=8 ou 16 LDU #ROCK BSR DROLL Routine commune au rollup et au rolldown. BRA VTCSR Derniere rangee et JMP a SCRCAL. COPYCH EQU * LDA ,X X pointe sur le bas du caractere {SCRPT) LEAX -INTERL,X Remontee d'une ligne "physioue". JSR STAY Y pointe sur le bas de l'emplacement de recopie DECB Compteur de recopies. BNE COPYCH RTS * ***** BACKSPACE * BACKSP EQU * BSR DPLCUR Deplacement curseur. LDA COLN Test bord gauche ( 1ere colonne = 1 ). CMPA #1 Arrive en debut de ligne ? BGT BSCONT Si non, pas de probleme particulier. TST COPCHR Flag de copie ? BEQ BACNOR COPCHR = 0 ==> pas de copie. LEAY -7*INTERL-1,X Recopie du caractere a la fin de la ligne BSR COPYCH d'avant car on etait en debut de ligne. BACNOR EQU * LDB #40 40 = derniere colonne. STB COLN BRA RETVT BSCONT EQU * TST COPCHR Flag d'option copie. BEQ BSNOR Si nul, pas de recopie. LEAY -1,X Recopie du caractere courant a sa gauche BSR COPYCH BSNOR EQU * DEC SCRPT+1 Colonne precedente, deplacement a gauche DEC COLN de SCRPT. RTS * ***** VERTICAL TABULATION * VERTAB EQU * JSR EFFCUR Reset curseur dans un etat connu: eteint. RETVT EQU * LDA RANG Est-on en haut de fenetre ? CMPA TOPRAN BLE OUTVT Si oui, a11er tester le mode page. DECA Si non, remonter simplement d'une ligne. SKIP2 VTCSR EQU * LDA BOTRAN Point d'entree en venant de horizontal BRA OUTHT tabulation. OUTVT EQU * TST PAGFLG Test du mode page quand on est en haut de BNE VTCSR fenetre sur VT. On en deduit scroll ou non. LDD #$0801 8 dans A (8 fois) et 1 dans B (masque de ATRANG) ANDB ATRANG Rolldown simple ou double ? BEQ SRLD Si bit1 = 0 : simple LSLA Sinon double : 16 recopies d'ecran SRLD EQU * PSHS A 8 ou 16 sur la pile et dans A * * Rolldown de la table des terminateurs pour suivre les mouvements de l'ecran * et introduction d'un FF (absence de lien) dans la ligne nouvellement entree. * TBD1 EQU * LDY BOTTAB Fin de la table des terminateurs. TBD0 EQU * CMPY TOPTAB Fini ? BLS TBOUT LDB ,-Y Saisie de la ligne superieure et remontee du pointeur STB 1,Y que l'on recopie sur la liqne courante BRA TBD0 On continue tant que la ligne superieure n'a pas ete faite TBOUT EQU * LDB #$FF STB ,Y La nouvelle ligne est initialisee avec un terminateur LSRA A vaut maintenant 4 ou 8 BITA #8 Etat du bit 3 ? BNE TBD1 Encore un tour si A = 8 PULS A Restaure A. LDX #DWNROL Routines de rolldown. LDU #DWNROK TTL ROUTINES BE ROLLUP ET DE ROLLDOWN * * ROUTINE COMNUNE AU ROLLUP ET AU ROLLDOWN * DROLL EQU * PSHS A,X,U CC sauvegarde, A=hauteur, X:Roll, U=Rock DWNBCL EQU * DEC ,S 8 ou 16 dans la pile suivant hauteur. BMI VEROUT Retour au bout de 8 ou 16 rollups. CALL FRM1 Mise en memoire caractere. JSR [1,S] Roll LDD BLOCZ Nouvelle rangee JSR [3,S] Rock LDA #$40 Masque pour Bit2 de STATUS qui determine ANDA STATUS ecriture caracteres seuls ou avec couleur. BNE RDWCH CALL FRM0 Mise en memoire couleur. JSR [1,S] Roll JSR LDACOL Nouvelle rangee JSR [3,S] Rock RDWCH EQU * TST SCROLS Scroll ligne (0) ou scroll soft ($FF) BNE DWNBCL VEROUT EQU * PULS A,X,U,PC En mode PAGE, on sort directement par SCRCAL * ***** ROUTINES DE ROLLDOWN * DWNROL EQU * STS SAVEST LDD STADR ADDD #INTERL STD TEMP Indicateur de fin de Rolldown. LDU ENDDR LEAS -INTERL-7,U TST SCROLS Soft-scroll#0; scroll-ligne=0 BNE NXTRUP LEAS -7*INTERL,S NXTRUP EQU * PULS A,B,DP,X,Y PSHU A,B,DP,X,Y LEAS -14,S CMPU >TEMP BHI NXTRUP BROL EQU * LDA #DIRECT TFR A,DP BROL2 EQU * LDS SAVEST RTS DWNROK EQU * STS SAVEST TFR D,X TFR D,Y TFR D,S LDU STADR LEAU INTERL,U TST SCROLS Soft-scroll#0 Scroll-ligne=0 BNE NXTKUP LEAU 7*INTERL,U NXTKUP EQU * PSHU A,B,X,Y,S CMPU STADR BHI NXTKUP BRA BROL2 * ***** ROUTINES DE ROLLUP * ROLL EQU * STS SAVEST LDS TEMP Pointeur dans size LDD 5,S 7*INTERL ou 15*INTERL LDU STADR LEAS INTERL,U STAD + 1 LIGNE LEAU 7,U TST SCROLS Soft scroll=1 Scroll-ligne=0 BNE NXTROL LEAS D,S S = 8*INTERL ou 16*lNTERL NXTROL EQU * PULS A,B,DP,X,Y PSHU A,B,DP,X,Y LEAU 14,U CMPS >ENDDR En etendu car DP n'est pas restaure BLO NXTROL BRA BROL Restitution de DP,S puis RTS. ROCK EQU * STS SAVEST ROCK traite la rangee du bas liberee par ROLL TFR D,X D=0000 ou D=[COLOUR,COLOUR] suivant l'appel TFR D,Y LDS TEMP LDD 3,S -7*interligne ou -15*interligne suivant le cas LDU ENDDR LEAU 8-INTERL,U TST SCROLS Scroll-ligne ou soft-scroll BNE ZROCK LEAU D,U U pointe 1 ou 2 rangees avant la fin de l'ecran ZROCK EQU * TFR X,D TFR D,S NXTROK EQU * PSHU A,B,X,Y,S LEAU 16,U CMPU ENDDR BLS NXTROK BRA BROL2 Restaure S puis RTS. TTL FORM FEED ET BEEP CLAVIER * ***** FORM FEED * FORFED EQU * CLR EFCMPT Il ne peut plus rester de trace de curseur due LDD BLOCZ a une mauvaise parite de EFCMPT. EFCONT EQU * TFR D,X TFR D,Y LDU <$25 NXTEFF EQU * PSHU A,B,X,Y 3 mots (16 bits) remis a zero, + 2 mots = 5 PSHU X,Y car 8000 bytes d'ecran, donc non div. par 6 CMPU STADR BGT NXTEFF LDD #$4001 Test du FF rapide.A=$4O pour STATUS et B=1 pour ANDA STATUS PRA. BNE OUTFF ANDB PRA 1er ou 2eme passage ? BEQ OUTFF JSR MEMCOL Mise en memoire couleur, LDA et LDB COLOUR. BRA EFCONT OUTFF EQU * LDX TOPTAB LDA #$FF TABFF EQU * STA ,X+ Nettoyage de la table des terminateurs. CMPX BOTTAB BLS TABFF JMP EFCNT JMP a BS pour positionner le curseur. * ***** "BEEP" DU CLAVIER * DRIING EQU * LDA 4,S Point d'entree par un envoi du code $07 TFR A,CC a PUTCH ==> on remet les IT dans l'etat. INTERN BUZZER BUZZER EQU * LDA STATUS Bit3 = inhibition buzzer BITA #%00001000 BNE EXBUZZ Si inhibe, on saute le buzzer. CLRA BEEP EQU * STA PRB INCA CLRB WTBEEP EQU * INCB BPL WTBEEP CMPA #17 ll Msec BNE BEEP EXBUZZ EQU * RTS TTL GESTION DIVERS ATTRIBUTS * ***** COMMANDES D'INCRUSTATION * INTERN INCRUS INCRUS EQU * LDA CRB ANDA #%11110111 Mise a zero de CB2 en output. BRA INCOUT INTERN NOINCR NOINCR EQU * LDA CRB ORA #%00001000 Mise a 1 de CB2 en output. INCOUT EQU * STA CRB RTS * ***** ATTRIBUTS DE TAILLE * SIZE EQU * ANDB #3 Les 2 LSB determinent la taille LDA ATRANG ANDA #$FC BSR ADDBA STA ATRANG RTS * ***** INVERSION DE FOND ET FORME * FSINV EQU * LDX STADR Point d'entree de l'inversion des couleurs plein ecran CALL FRM0 Mise en memoire couleur, NXTINV EQU * LDA ,X Octet couleur BSR INCOM STA ,X+ CMPX ENDDR BNE NXTINV INVERT EQU * LDA COLOUR Point d'entree de l'inversion des attributs de couleur BSR INCOM BRA STACOL INCOM EQU * TFR A,B A = octet couleur. LSRA LSRA LSRA LSRA BSR LSLB4 Mise en position couleur fond. ADDBA EQU * PSHS B ADDA ,S+ RTS * ***** TOUR DE L'ECRAN * TOUR EQU * LSLB En position 1,2,3,4 = couleur tour. ANDB #%00011110 LDA PRA ANDA #%11100001 BSR ADDBA STA PRA RTS * ***** MISE EN MEMOIRE CARACTERE * INTERN FORME1 FORME1 EQU * PSHS A LDA #1 ORA PRA BRA STAPRA * ***** MISE EN MEMOIRE COULEUR * INTERN FORME0 FORME0 EQU * PSHS A LDA #$FE ANDA PRA STAPRA EQU * STA PRA PULS A,PC Restitution de A et RTS. * ***** POUR OPTIMISATION CHMASK ET LSLB4 * CHMASK EQU * LDA #$0F Masque pour couleur caractere. LSLB4 EQU * LSLB Routine separee pour optimisation. LSLB LSLB LSLB RTS * ***** COULEUR DU FOND * FSBACK EQU * ANDB #$0F Les 4 bits de droite sont la couleur FOND. LDA #$F0 Masque de la forme. PSHS A Sauvegarde du masque. BSR SAMCOL Traitement commun fond ou forme plein ecran. PULS A Restitution masque. BACK0 EQU * ANDB #$0F Entree attribut courant = seul le registre LDA #$F0 COLOUR est modifie en COLBRA. BRA COLBRA * ***** TRAITEMENT COMMUN COULEUR FOND OU FORME * SAMCOL EQU * CALL FRM0 Mise en memoire couleur. STB TEMP STB TEMP+1 LDX STADR Debut de la fenetre. NXTCOL EQU * LDD ,X 2 octets de couleur a la fois. ANDA 2,S ANDB 2,S $F0 ou $0F : masque de fond ou forme. ADDD TEMP Concatenation nouvelle couleur au nibble STD ,X++ gui doit rester intact et stockage en CMPX ENDDR memoire couleur jusqu'a ENDOR = fin de la BNE NXTCOL fenetre. LDB TEMP Restitution de B pour la suite du traitement. RTS * ***** COULEUR DU CARACTERE * FSCHAR EQU * BSR CHMASK 4 LSB en couleur forme et masque ($0F) dans A PSHS A Sauvegarde du masque. BSR SAMCOL Remplissage memoire: commun fond ou forme. PULS A Restitution masque SKIP2 ( en venant du plein ecran, A = $0F) CHCOL EQU * BSR CHMASK Bits 3,2,1,0 --> 7,6,5,4 et $0F dans A. COLBRA EQU * ANDA COLOUR Attributs courants : seul COLOUR est modifie. BSR ADDBA Concatenation des deux nibbles fond/forme. STACOL EQU * STA COLOUR RTS * ***** SCROLL ***** * SCROLL EQU * CLR PAGFLG Mise en mode scroll liqne par defaut. CMPB #$7A $7A = code du mode page. BEQ MPAGE CLR SCROLS Mise en scroll rapide par defaut. LSRB Si B=$79, la carry passe a 1 ==> scroll doux, BCC ROLOUT On avait B=$7B (scroll ligne) ==> RTS COM SCROLS Pour le scroll doux, $FF --> SCROLS SKIP2 MPAGE EQU * COM PAGFLG Pour le mode page, $FF --> PAGFLG ROLOUT EQU * RTS * ***** POSITIONNEMENT DES SEQUENCES * SS2CH EQU * INCA On entre avec A=0 (CLRA dans le noyau de PUTCH) USCH EQU * par l'une des entrees trouvees dans TABDEC. INCA ESCCH EQU * INCA A vaut donc 1, 2, ou 3 .... LSLA ... multiplie par deux pour un offset sur des STA SEQUCE mots dans TABSEQ. 2 pour ESC, 4 pour US, ou 6 RTS pour SS2 --> SEQUCE pour le prochain appel. TTL SEQUENCE UNIT SEPARATOR : CURSEUR ET FENETRE * ***** UNIT SEPARATOR * UNSEP EQU * TST US1 1er PARAMETRE ? BNE NXTPAR Si USl#0,c'est qu'on y a ranqe le ler parametre STB US1 RTS NXTPAR EQU * JSR EFFCUR CMPB #$40 B=2eme parametre. Si B>=$40 c'est un position- * nement du curseur en Y,X ou les coordonnees * sont les 6 LSB des deux parametres. BLT INFA40 Si B<$40 c'est un positionnement en debut de * liqne,donne par les 4 LSB des 2 parametres, * sous la forme pl*10+p2.Le sens de ce position- * nement depend des 4 MSB des parametres : * $1=liqne du bas de le fenetre active, * $2=ligne du haut de la fenetre, * $3=positionnement du curseur au debut d'une * ligne($4 et + nous ramene au premier cas Y,X) ANDB #$3F 6 LSB du 2eme parametre. Positionnement du curseur en Y,X STB COLN = colonne LDB US1 ANDB #$3F 6 LSB du 1er parametre STB RANG (= rang) BSR SCRCAL Calcule SCRPT a partir de RANG et COLN. BRA EXITUS Sortie de la sequence. INFA40 EQU * CMPB #$30 Sequences du type o1*10+o2 BGE EXITUS Entre $30 et $3F on ignore la sequence. LDU RANG On construit les bornes de la fenetre active. LDX SCRPT Sauvegarde de RANG/COLN et de SCRPT. PSHS X,U Sauvegarde de la position courante du curseur CMPB #$20 qui ne doit pas changer. BLT BOTTOM Bas de la fenetre : Si 4MS8=$l, c'est le bas de la fenetre BSR DCONV sinon, 4MSB=$2 : Sommet de la fenetre STB TOPRAN RANG et COLN sont positionnes, et B contient RANG BSR SCRCAL Permet le calcul de SCRPT SUBD #7*INTERL Que l'on ramene au premier octet en haut a gauche de la fene STD STADR Registre de l'origine physique de la fenetre BRA EXITW BOTTOM EQU * BSR DCONV Idem, sauf que c'est le bas de la fenetre STB BOTRAN BSR SCRCAL ADDD #INTERL Dernier octet en bas a droite de la fenetre + 1 STD ENDDR Registre de la fin physique de la fenetre + 1 EXITW EQU * PULS X,U Restauration de RANG, COLN et SCRPT qui ont STU RANG servi de reqistres de calcul. STX SCRPT EXITUS EQU * CLR US1 Sequence de sortie CLR SEQUCE RTS TTL SEQUENCES D'ECHAPPEMENT : MODIFICATION DES ATTRIBUTS * ***** CALCUL ADRESSE PHYSIOUE POINTEUR ECRAN ***** * SCRCAL EQU * LDA RANG Calcul du pointeur a partir de RANG et COLN JSR ADRPHY Calcul adresse physique dans GETSC. ADDB COLN STD SCRPT RTS * ***** CONVERSION CODE COORDONNEES EN BINAIRE ***** * DCONV EQU * CLR COLN Conversion binaire decimal en decimal INC COLN COLONNE commence a 1. ANDB #$0F 4 LSB STB RANG LDA US1 ANDA #$0F 4 LSB LDB #10 MUL ADDB RANG STB RANG RANG=(4LSB de pl)*10+4LSB de p2 RTS * ***** DECODAGE DES SEQUENCES D'ECHAPPEMENT * ESCAPE EQU * LDA #$80 CMPB #SP BEQ FULSCR Si B=SP,on pose un flaq de sequence plein ecran CMPB #$40 Les attributs commencent a $40 BLT OUTESC B # SP et < $40 : on sort. ATDEC EQU * LDU #TABAFS TST ATRANG C'est l'attribut. Il est normal ou plein ecran BMI SELECT X=TABAFS si l'attribut est piein ecran LEAU $0F,U X= TABATR si l'attribut est courant SELECT EQU * CMPB ,U Recherche dans la table : le code de la table * est une valeur suivie d'un pointeur ou l'on * doit se brancher si l'attribut est >= au code. LEAU $03,U on pointe sur le code suivant. BLO SELECT Si =$7C rien FDB NOATR FCB $7B [$7B] inversion video plein ecran FDB FSINV FCB $60 [$6F-$60] rien FDB NOATR FCB $50 [$5F-$50] Couleur fond plein ecran FDB FSBACK FCB $40 [$4F-$40] Couleur caractere plein ecran sature FDB FSCHAR ou pastel. TABATR EQU * FCB $7C >=$7C rien FDB NOATR FCB $7B [$7B] Inversion video FDB INVERT FCB $78 [$7A-$78] Paqe,scroll doux et scroll ligne FDB SCROLL FCB $77 [$77] Mode incruste FDB INCRUS FCB $76 [$76] Mode non-incruste FDB NOINCR FCB $75 [$75] Ecriture caractere seul FDB ROLFST FCB $74 [$74] Eriture caractere et couleur FDB ROLNOR FCB $70 [$73-$70] Taille FDB SIZE FCB $60 [$6F-$60] Couleurs tour saturees ou non FDB TOUR FCB $50 [$5F-$50] Couleurs de fond pastel ou sature FDB BACK0 FCB $40 [$4F-$40] Couleurs caractere pastel ou sature FDB CHCOL * Ensuite rien, car on n'entre dans la table que si B >=$40 * ***** TABLES DES SEQUENCES * TABSEQ EQU * FDB NORMAL,ESCAPE,UNSEP,SS2EX * ***** TABLES DES CODES INTERPRETABLES * TABDEC EQU * FDB DRIING,BACKSP,HORTAB,LINFED,VERTAB,FORFED,CARRET,EXIT,EXIT,EXIT FDB CURSON,EXIT,EXIT,CURSOF,EXIT,SS2CH,EXIT,CANCEL,EXIT,EXIT,ESCCH FDB EXIT,EXIT,RECSEP,USCH * ***** PARAMETRES DE SIMPLE ET DOUBLE HAUTEUR * SSIZE EQU * FCB 1 + RANG FDB 7*INTERL+1,-7*INTERL,7*INTERL FCB 0 DSIZE EQU * FCB 2 ++ RANG FDB 15*INTERL+1,-15*INTERL,15*INTERL FCB 1 Offset sur RANG END