.TITLE VL3 .psect VL3 ; stored on: VL3.MAC ; last revised: 8-Sep-82 ; MODULE PAGE CONTENTS ; VL3 10 ****** TRUCS SPECIAUX : STATUS, SYNONYM, MEMORY. ; 12 ****** Fonctions sur COLORIX. [JER] JUL-79 .globl atprnt,atread,cranb,errmp,evca1,false,gtst .globl ipti,nil,opti,valnb2 ; ****** TRUCS SPECIAUX : STATUS, SYNONYM, MEMORY. ; ***** (STATUS READ/PRINT [N]) [FSUBR] status:: uncns ; a2 = READ/PRINT, a1 = ([N]) cmp a2,#atprnt bne stts1 mov #opti,a2 ; adresse opti dans a2. br stts8 stts1: cmp a2,#atread bne erstt mov #ipti,a2 ; adresse ipti dans a2. stts8: push a2 ; sauve l'adresse. call evca1 ; evalue le [N]. pop a2 jmp gtst ; vers les get/set. erstt: ; erreur identificateur status. push a2 ; le nom incorect. mov #erstm,a1 jmp errmp erstm: .asciz /* STATUS error : / .even ; ***** (SYNONYM AT1 AT2) [SUBR 2] ; attributs(a1) <- attributs(a2). synony:: mov dpfval(a2),dpfval(a1) mov dpftyp(a2),dpftyp(a1) ; MOV pour avoir f-typ ET p-typ. return .page ; ***** (MEMORY N1 [N2] [N3]) [SUBR 3] ; N1, N2, 2 nombres. ; si N2 est donne, depose sa valeur binaire ; a l'adresse memoire N1. ; if N3=T then do the write as a byte operation [PM] ; return nil for write operations. memory:: call valnb2 ; a1 = val(a1), a4 = val(a2) jtnil a2,3$ jtnil a3,1$ ; [PM] movb a4,(a1) ; [PM] br 2$ ; [PM] 1$: mov a4,(a1) 2$: jmp false ; [PM] 3$: mov (a1),a1 jmp cranb ; ***** (PRAISE) [SUBR 0] praise:: return ; %%%%%% ; ****** Fonctions sur COLORIX [JER] JUL-79 ; [PM] these functions require special hardware which I believe ; is not commercially available. .IF NE,COLORX ;***************************************************** ; Fonctions COLORIX sur PDP11 ; ; [JER] Juillet 79 ; ; Toutes les variables commencent par COL... ; Toutes les fonctions commencent par VIS... ;***************************************************** COLETA=177554 ; etat COLORIX COLRIX=177556 ; donne COLORIX COLMK3=177770 ; masque de 3 bits COLMK9=177000 ; masque de 9 bits ; Codage des informations dans le mot COLORIX ; ; 0 000 xxx xxx xxx Position en X ; 0 010 yyy yyy yyy Position en Y ; 0 100 rrr bbb vvv Couleur d'un point ; 1 000 rrr bbb vvv Init ecran a une couleur ; TOUS les arguments des fonctions COLORIX sont des ; nombres dont les valeurs ne depassent jamais 512. ; Mais il faut quand meme appeller la routine ; VALNB en cas de nombres tres grans ou negatifs. ; Les fonctions sont : ; ; (VISINI r b v) qui initialise l'ecran a la couleur r, b, v. ; (VISPOT r b c x y) qui envoie un point de couleur r, b, v, ; a la position x, y. ; (VISEGM r b v x1 y1 x2 y2 ... xN yN) qui trace des vecteurs ; de couleur r, b, v, la position des vecteurs etant ; x1 y1 x2 y2 pour le 1er ; x2 y2 x3 y3 pour le 2eme ; xN-2 yN-2 xN-1 yN-1 pour l'avant dernier ; xN-1 yN-1 xN yN pour le dernier. ; Ca trace donc une ligne polygonale. ; (VISMEM x y [z]) donne acces directement a la memoire de COLORIX. ; Si [z] est fourni, ca devient le nouveau contenu de la ; memoire x,y. Dans tous les cas, ; retourne la valeur courante du contenu du mot ; memoire COLORIX d'adresse x,y. .ENDC .page .IF NE,COLORX ; Toutes ces fonctions (de type FSUBR) possedent des ; arguments dans le meme ordre : ; - r : qui represente l'intensite du rouge (modulo 8) ; - b : qui represente l'intensite du bleu (modulo 8) ; - v : qui represente l'intensite du vert (modulo 8) ; puis un nombre variable (en fonction du type de la fonction) ; de couple de coordonnees : ; - x1 : qui represente le numero d'une colonne (modulo 512) ; - y1 : qui represente le numero d'une ligne (modulo 512) ; x2 y2 ... xN-1 yN-1 xN yN ; ;----- Donnees utilisees par les fonctions COLFNT: .WORD 0 ; nom de la fonction (en cas d'erreur) COLCOL: .WORD 0 ; couleur calculee pour la fonction COLXD: .WORD 0 ; valeur du X depart COLYD: .WORD 0 ; valeur du Y depart COLXA: .WORD 0 ; valeur du X arrivee COLYA: .WORD 0 ; valeur du Y arrivee .ENDC .page .IF NE,COLORX ;----- COLEVA : S.P. interne qui evalue l'argument suivant ; de A1 et met sa valeur dans A5. Si cet argument n'est ; pas un nombre, un message d'avertissement est imprime, ; qui contient le nom de la fonction et l'argument merdique. COLEVA: PUSH CDR(A1) ; sauve le reste call EVCA1 ; evalue son CAR ; une amelioration souhaitable serait de reecrire ; le debut de EVAL pour des raisons de rapidite. JTNUM A1,COLEV2 ; c'est bien un nombre ; fabriquer et imprimer un message d'AVERTISSEMENT UNIQUEMENT ; qui dit : ** Fonction : mauvais argument : ; ya dans A1 l'argument qui merde et dans COLFNT le nom ; de la fonction qui etait en cours. push a1 mov #colms1,a1 call prstr mov colfnt,a1 call probj mov #colms2,a1 call prstr pop a1 call probj call pcrlf CLR A5 ; par defaut 0 POP A1 ; recupere la liste des args return ; et on rentre. COLEV2: call VALNB ; A1 _ la valeur du nombre, MOV A1,A5 ; resultat dans A5. POP A1 ; recupere la liste des args. return ; voila. colms1: .asciz /** Function :/ .even colms2: .asciz / Bad argument :/ .even .ENDC .page .IF NE,COLORX ;----- COLCAL : S.P. interne calcule la couleur ; resultat dans COLCAL (avec bit couleur) et A5 sans le bit ; obtenue par l'evaluation des 3 arguments suivants de A1. COLCAL: call COLEVA ; evalue le 1er argument BIC #COLMK3,A5 ; masque la couleur ASL A5 ASL A5 ASL A5 ; place pour le reste MOV A5,COLCOL ; range temporairement call COLEVA ; evalue le 2eme argument BIC #COLMK3,A5 ; masque la couleur BIS COLCOL,A5 ; ajoute le rouge ASL A5 ASL A5 ASL A5 MOV A5,COLCOL ; range temporairement le r, b. call COLEVA ; evalue le 3eme argument. BIC #COLMK3,A5 ; masque la couleur BIS A5,COLCOL ; COLCOL=r+b+v MOV COLCOL,A5 ; coul sans bit dans A5 BIS #4000,COLCOL ; force bit couleur return ;----- COLCOR : S.P. interne : evalue les coordonnees du point ; suivant (2 args suivants de A1). Met la valeur dans Xa et Ya. ; N'effectue pas de tests de validite COLCOR: call COLEVA ; evalue le x MOV A5,COLXA ; sauve dans le X arrivee call COLEVA ; evalue le y MOV A5,COLYA ; sauve dans le Y arrivee return ; et voila c'est tout. .ENDC .page .IF NE,COLORX ;----- COLOUT : S.P. interne : affiche un point colore ; la couleur est dans COLCOL ; les coordonnees dans COLXA et COLYA ; Si les coordonnees sont incorrectes YA RIEN D'AFFICHE! COLOUT: PUSH #COLRIX ; adresse de COLORIX. MOV COLXA,A5 ; coordonne en X BMI 1$ ; c'est < 0 ? CMP A5,#383. ; c'est >= 384 ? BHIS 1$ ; ouaip : rentre de suite MOV A5,@(P) ; sort le X. MOV COLYA,A5 ; coordonne en Y BMI 1$ ; c'est < 0 ? CMP A5,#255. ; c'est >= 256 BHIS 1$ ; ouaip : rentre de suite BIS #2000,A5 ; force le bit Y. MOV A5,@(P) ; sort le Y. MOV COLCOL,A5 ; recupere la couleur. MOV A5,@(P) ; vide 1 fois MOV A5,@(P) ; vide 2 fois (merci luigi). 1$: TST (P)+ ; depile #COLRIX return ; et c'est tout ;***** (VISINI r b v) [FSUBR] ; Initialise l'ecran a la couleur r, b, v. VISINI:: MOV #ATVISI,COLFNT ; sauve le nom de la fonction call COLCAL ; calcul la couleur BIS #10000,A5 ; bit de init ecran MOV A5,@#COLRIX ; envoie A5 BR COLRET ; voila. ;***** (VISPOT r b v x y) [FSUBR] ; allume un point colore VISPOT:: MOV #ATVISP,COLFNT ; sauve le nom de la fonction call COLCAL ; calcul la couleur call COLCOR ; calcul les coordonnees. call COLOUT ; sort le point colore ; COLRET doit suivre. ;----- COLRET : retour standard de toutes les fonctions COLRIX ; attention a la distance du dernier BR COLRET de VISEGM! ; ramene toujours le nom de la fonction COLRET:: MOV COLFNT,A1 ; recharge le nom de la fonction return ; et on rentre. .ENDC .page .IF NE,COLORX ;***** (VISEGM r b v x1 y1 ... xN yN) [FSUBR] ; trace une suite de segments (polygone) VISEGM:: MOV #ATVISS,COLFNT ; sauve le nom de la fonction call COLCAL ; calcul de la couleur call COLCOR ; calcul des coordonnees JMP VISEG9 ; en avant. VISEG1: MOV COLXA,COLXD ; transfert arrivee -> depart MOV COLYA,COLYD ; transfert arrivee -> depart call COLCOR ; calcul des 2 autres coordonnees. PUSH A1 ; sauve le reste des arguments ; calcul des Dx Dy et leurs val absolues MOV COLXD,A2 SUB COLXA,A2 ; A2 <- Xa - Xd MOV A2,A1 BGE 1$ NEG A1 ; A1 <- abs(Xa-Xd) 1$: MOV COLYD,A3 SUB COLYA,A3 ; A3 <- Ya - Yd MOV A3,A4 BGE 2$ NEG A4 ; A4 <- abs(Ya-Yd) 2$: CMP A1,A4 ; test les 2 valeurs absolues BLT VISEG5 ; c'est un autre type de vecteur TST A2 BGE 3$ ; bon sens PUSH COLXD MOV COLXA,COLXD ; COLXD <-> COLXA POP COLXA PUSH COLYD MOV COLYA,COLYD ; COLYD <-> COLYA POP COLYA NEG A3 ; nb de pas en Y 3$: ;;; Vecteur progression en X MOV #1,A1 ; incr Y=1 TST A3 BEQ 4$ BGT 5$ NEG A1 BR 5$ 4$: CLR R1 ; incr Y=0 5$: CLR R4 ; init compteur X ; ecriture en X .ENDC .page .IF NE,COLORX VISEG2: call COLOUT ; sort le point colore MOV COLXD,A2 SUB COLXA,A2 ; A2 <- Xa - Xd BEQ VISEG8 ; C'est fini. MOV COLYD,A3 SUB COLYA,A3 ; A3 <- Ya - Yd BGE 1$ NEG A3 1$: INC COLXA ; incr X ADD A3,A4 CMP A4,A2 BLT VISEG2 SUB A2,A4 ADD A1,COLYA ; incr Y BR VISEG2 VISEG5: TST A3 ;;; progression en Y BGE 1$ PUSH COLXD MOV COLXA,COLXD ; COLXD <-> COLXA POP COLXA PUSH COLYD MOV COLYA,COLYD ; COLYD <-> COLYA POP COLYA NEG A2 1$: MOV #1,A1 ; inc Y=1 TST A2 BEQ 2$ BGT 3$ NEG A1 ; inc Y=-1 BR 3$ 2$: CLR A1 ; inc Y=0 3$: CLR A4 ; init compteur ; ecriture en Y VISEG7: call COLOUT ; sort le point colore MOV COLYD,A3 SUB COLYA,A3 ; A3 <- Yd-Ya BEQ VISEG8 ; C'est fini. MOV COLXD,A2 SUB COLXA,A2 ; A2 <- Xd-Xa BGE 1$ NEG A2 ; A2 <- abs(Xd-Xa) 1$: INC COLYA ; avance en Y ADD A2,A4 CMP A4,A3 BLT VISEG7 SUB A3,A4 ; compte modulo abs(Yd-Ya) ADD A1,COLXA BR VISEG7 .ENDC .page .IF NE,COLORX VISEG8: POP A1 ; recup le reste des arguments VISEG9: CMP A1,#BLIST ; macro-genere le JTLST BLO 1$ ; mais il est trop loin! JMP VISEG1 1$: CLR R3 ; apres tous ces calculs, il faut penser au G.C.! JMP COLRET ; et on rentre peinard (mais c'est loin). ;***** (VISMEM x y [z]) FSUBR ; Attendre les codes from LUIGI! VISMEM:: MOV #ATVISM,COLFNT ; Sauve le nom de la fonction. call COLCOR ; calcul des coordonnees de la memoire. ; On peut plus rien faire MOV #VISMSG,A1 ; pour raler. call PRSTR ; on imprime. call PCRLF JMP COLRET ; et on rentre. VISMSG: .ASCIZ / Louis comment ciel lire la memoire de COLORIX????/ .EVEN .ENDC .end ; ****** END OF VL3 ******