INCLUDE EQMON Appel des equates TTL MONITEUR MO5: ROUTINES GRAPHIQUES HAUTE DEFINITION SECT GRAPHI EXTERN LSLB4,FORME0,FORME1 * ***** VERSION POUR HARD MO5 * ******************************************************************************* * PLOTXY allume le point passe par X [0,319] et Y [0,199] dans la couleur * * donnee par le registre FORME : 15 a 0 pour forme et -16 a -1 pour fond * * Registres utilises : PLOTX et PLOTY qui conservent X et Y et le registre * * FORME. * * DRAWXY trace le vecteur entre le dernier point donne par PLOTX et PLOTY * * et X et Y, toujours dans la couleur donnee par le registre FORME. * * Les registres temporaires utilises sont SAVEST et TEMP. * * Si le registre CHDRAW # 0, PLOT et DRAW sont en mode caractere et affi- * * chent le caractere dont le code ASCII est dans CHDRAW. Dans ce cas, * * X = [1,40] et Y = [0,24] * * * ******************************************************************************* DELTAY EQU SAVEST DELTAX EQU K7DATA * ***** POINTS "CARACTERES" * INTERN CHPLOT CHPLOT EQU * BSR STYX Pour optimisation, creation de la routine STYX. LDA PAGFLG PSHS A Sauvegarde du mode. LDA #$FF STA PAGFLG Mise en mode page. LDB #US Positionnement du curseur CALL PUTC Simulation de JSR PUTCH TFR Y,D ADDB #$40 ATTENTION: Y va de 0 a 24 CALL PUTC 1er PARAMETRE envoye a PUTCH. TFR X,D ADDB #$40 ATTENTION: X va de 1 a 40 CALL PUTC 2eme PARAMETRE envoye a PUTCH. LDB CHDRAW CALL PUTC Caractere envoye a PUTCH. PULS A STA PAGFLG Restauration du curseur. RTS * ***** POUR OPTIMISATION,ROUTINES "STYX" ET "MASQUE" * STYX EQU * STX PLOTX STY PLOTY RTS MASK01 EQU * LDB PLOTX+1 MASQUE EQU * LDU #TABIT Table des masques dans l'octet physique MASK02 EQU * ANDB #7 B = Reste de X/8 LDA B,U A = masque. RTS * ***** STATUT D'UN POINT DANS L'ACCUMULATEUR B * INTERN GETPT GETPT EQU * BSR CALCUL X physique au retour de calcul. JSR FORME0 Mise en memoire couleur. LDB 7,S Contenu de X (colonne) dans B. BSR MASQUE LDB ,X Octet couleur. INC PRA Mise en memoire caractere. ANDA ,X A=0 ==> fond ; A=1 ==> forme. BNE ZER Si A=1 la couleur est dans les bits 4,5,6,7 ANDB #$0F Si A=0 la couleur est dans les bits 0,1,2,3 COMB SKIP2 --> fin de traitement. ZER EQU * BSR LSRB4 STB 4,S Mise du resultat dans la pile. RTS * ***** ALLUMAGE OU EXTINCTION D'UN POINT * INTERN PLOTXY PLOTXY EQU * TST CHDRAW Si CHDRAW # 0, c'est un point "caractere" BNE CHPLOT Point "caractere" ==> appel a PUTCH. BSR STYX STX PLOTX et STY PLCTY. BSR CALCUL X = adresse physique au retour. BSR MASK01 A = masque du point au retour. * **** AFFICHAGE FORME ET COULEUR **** **** ENTREE : B = BITS A ECRIRE, X = ADRESSE PHYSIQUE, FORME = COULEUR * FNDFRM EQU * JSR FORME1 Mise en memoire caractere {reg. sauvegardes) LDB FORME Test de fond ou forme -16 a +15 BMI ZERO Fond = bit a mettre a 0. BSR ORAX OR du masoue (A) avec l'octet forme. BNE EXEND Bit4 de STATUS a 1 ==> pas d'ecriture de couleur. JSR LSLB4 (7,6,5,4) <-- (3,2,1,0): couleur en "forme". LDA #%00001111 Masquage de la couleur forme a remplacer. BRA SUITE ZERO EQU * COMA Masque complemente pour mettre a 0 le bit. BSR ANDAX Test du bit 4 de STATUS pour point "rapide". BNE EXEND Test sur STATUS fait en fin de GRAX/ANDAX. COMB Couleur de fond complementee a 1 --> 4 LSB. LDA #%11110000 Masquage de la couleur fond a remplacer. SUITE EQU * JSR FORME0 Mise en memoire couleur, ne detruit pas A. BSR ANDAX Mise a 0 des bits de couleur a remplacer. ADDB ,X Nouveaux bits de couleur a leur place. STB ,X Ranges dans l'octet correspondant. EXEND EQU * RTS * ***** ORAX ET ANDAX POUR OPTIMISATION * ORAX EQU * ORA ,X X = adresse physique de l'octet contenant le SKIP2 pixel a "allumer" ou a "eteindre". ANDAX EQU * ANDA ,X STA ,X LDA STATUS Dans le cas du 2eme appel a ANDAX, ce test ne BITA #%00010000 veut rien dire mais B n'est pas utilise apres. RTS Ratour soit dans SWITCH, soit dans CALLPL LSRD1 EQU * LSRA == LSRD RORB SKIP2 Pour terminer seulement par 2 LSRB. LSRB4 EQU * LSRB LSRB LSRB LSRB RTS * ***** CALCUL ADRESSE PHYSIQUE ***** * ENTREE : X= abscisse, Y= ordonnee - SORTIE : X = ADRESSE PHYSIQUE * INTERN CALCUL CALCUL EQU * TFR Y,D B <-- Ylow. LDA #40 A <-- 40 (40 bytes par ligne de pixels) MUL D <-- Y * 40 EXG D,X D <-- X coord. X <-- Ycoord. * 40 BSR LSRD1 D <-- X coord. / 8 : 8 pixels par octet LEAX D,X X <-- Ycoord. * 40 + xcoord. / 8 RTS X = adresse memoire de l'octet * ***** TRACE VECTEUR HORIZONTAL RAPIDE ***** * DRWLIG EQU * CMPX PLOTX X >= PLOTX ==> vecteur de gauche a droite. BHS NORMAL LDU PLOTX Inversion : PLOTX --> X EXG X,U X --> PLOTX STU PLOTX NORMAL EQU * PSHS X Sauvegarde coordonnees arrivees pour le LDD PLOTX traitement final. BSR LSRD1 D = PLOTX/8 PSHS B Sauvegarde de PLOTX/8 LDX PLOTX X = X0 origine. BSR CALCUL X = X0 adresse physique. LDD 1,S D = destination. BSR LSRD1 LSRD et deux LSRB = division par 8. SUBB ,S+ D = X/8 - PLOTX/8 BEQ INBYTE Si D nul, on est dans un octet. STB TEMP+1 JSR MASK01 LSLA Car U pointait un octet trop loin donc *2. DECA A <-- A-1 car commence a TABIT-1. AFFICH EQU * BSR FNDFRM Appel routine d'affichage des points. LEAX 1,X Octet suivant a afficher. LDA #$FF DEC TEMP+1 Decrement du compteur d'octets. BGT AFFICH BRA OUTLIG INBYTE EQU * JSR MASK01 LSLA DECA OUTLIG EQU * STA TEMP+1 LDD ,S D <-- destination. JSR MASK02 NEGA ANDA TEMP+1 JSR FNDFRM Affichage forme et couleur. LDX 10,S Pour mettre X destination comme origine par STX PLOTX defaut de la prochaine ligne. PULS A,B,X,PC Remise en etat de la pile et RTS. * ***** TRACE D'UN VECTEUR [PLOTX,X,PLOTY,Y] * INTERN DRAWXY DRAWXY EQU * LDD #$0101 INCX et INCY mis a +1 par defaut sur la pile PSHS A,B Registres d'increment. CLRA LDB 11,S Y+1 [0-199] = Y low. SUBB PLOTY+1 B = Y destination - Y origine BHI D0 DELTAY positif. BNE NEGINC DELTAY < 0 ==> -1 --> INCX et INCY. TST CHDRAW Si CHDRAW # 0, pas de trace rapide. BEQ DRWLIG Si DELTAY = 0 et CHDRAW = 0 trace rapide. NEGINC EQU * NEG 1,S Increment sur Y = -1 . DeltaY<=O NEGB Delta Y = ABS (Delta Y) D0 EQU * STD DELTAY DeltaY positif LDD 8,S X destination = Xh/Xlow . SUBD PLOTX D = X destination - X origine BHS D1 DeltaX positif ou nul. NEG ,S Increment sur X = -1 BSR NEGATD Delta X <-- ABS (Delta X) D1 EQU * STD DELTAX LDX PLOTX X,Y= points d'origine. Les points d'arrivee sont sur la pile LDY PLOTY CMPD DELTAY D = ABS (Delta X) >? ABS (Delta Y) BHI DRAW1 |DELTAX| > |DELTAY| ==> INC/DECX systematique. LDD DELTAY BEQ OUTDRW |DELTAX| <= |DELTAY|, DELTAY nul ==> DELTAX = 0 * BSR NEGATD D <-- -|DELTAY| ASRA RORB D <-- (-|DELTAY|) / 2 * TRACE2 EQU * BSR CHANGY INC (resp. DEC) Y systematiquement. ADDD DELTAX D <-- N(y) DELTAX - DELTAY/2 -N[x) DELTAY BMI NXTR2 5i D<0 on continue, sinon on fait X=X-/+1 BSR CHANGX Modifier X. SUBD DELTAY NXTR2 EQU * BSR CALLPL Option grephique : appel a PLOTXY. CMPY 10,S Y est sur la pile : sortie des que Y = Y destination BNE TRACE2 PULS A,B,PC Effacement de INCX,INCY et retour. DRAW1 EQU * BSR NEGATD D <-- -|DELTAX|/2 ASRA On forme D=-D/2, expression qui, quand elle RORB devient >D, exprime que l'on doit incrementer Y * TRACE1 EQU * BSR CHANGX Modifier X systematiquement. ADDD DELTAY BMI NXTR1 X=X-+1 si D<0 on continue, si D>=0 on fait Y=Y-+1 BSR CHANGY Modifier Y. SUBD DELTAX NXTR1 EQU * BSR CALLPL Appel a PLOTXY CMPX 8,S X est sur la pile : sortie des que X = X destination BNE TRACE1 OUTDRW EQU * PULS A,B,PC Effacement de INCX et INCY CALLPL EQU * PSHS A,B,X,Y,U Sauvegarde des registres detruits par PLOTXY JSR PLOTXY PULS A,B,X,Y,U,PC Restitution des registres et RTS. CHANGX EQU * PSHS A LDA 3,S Pile = A/PCh/PCl/INCX/INCY... LEAX A,X INC ou DEC X suivant que INCX vaut + ou - 1. PULS A,PC CHANGY EQU * PSHS A LDA 4,S Pile = A/PCh/PCl/INCX/INCY LEAY A,Y INC ou DEC Y suivant que INCY vaut + ou - 1. PULS A,PC NEGATD EQU * COMA D <-- -D COMB ADDD #1 RTS * ***** TABLE DES BITS A ALLUMER OU ETEINDRE ***** * FCB $00 TABIT EQU * FCB $80,$40,$20 INTERN OCTTBL OCTTBL EQU * FCB $10,8,4,2,1 Sert pour la table d'octaves de MUS (Basic) END