************************************************************* * * Les Macros LLM3 pour el Vaxo Real * ************************************************************* * * Jerome CHAILLOUX * * I . N . R . I . A . * Domaine de Voluceau, Rocquencourt * B.P. 105 78153 Le Chesnay Cedex * Tel : (1) 954 90 20 poste 456 * ************************************************************* * TTL Le_Lisp 68K, by Jerome Chailloux. * OPT MEX je veux voir les macro-expansions * OPT NOCL mais pas les conditionnelles * FORMAT je veux une liste bien formattee * Definition des sections * NOLIST en general. * PAGE ******************************************** * * * Allocation des registres * * * ******************************************** * r0 reserve pour les interfaces systemes (et registre * adresse auxilliaire) * A1=r1 | * A2=r2 | les fameux 4 * A3=r3 | accus de LISP * A4=r4 | * A5 ??? mais Pascal y tient! * A6=r5 le pointeur sur la liste libre FREE * r14 le pointeur de pile LISP * D0=r10 reserve pour les interfaces systemes * D1=r11 accu 1 arithmetique * D2=r12 accu 2 arithmetique * D3 ??? * D4=r6 BSTRG debut de la zone des chaines * D5=r7 NIL adresse de NIL (debut des symboles) * D6=r8 BVAR debut de la zone des variables * D7=r9 BCONS debut de zone liste *************************************** * * * EQU symboles d'acces * * * *************************************** * EQU symboles d'acces aux proprietes naturelles des symbols CVAL EQU 0 adresse 32 bits PLIST EQU 4 adresse 32 bits FVAL EQU 8 adresse 32 bits PKGC EQU 12 adresse 32 bits ALINK EQU 16 adresse 32 bits FTYPE EQU 20 code 8 bits PTYPE EQU 21 code 8 bits PLEN EQU 22 compteur 16 bits PNAME EQU 24 caractere 8 bits ... * EQU symboles d'acces aux chaines de caracteres et aux tableaux VAL EQU 0 * EQU symboles d'acces aux doublets de liste CAR EQU 0 adresse 32 bits CDR EQU 4 adresse 32 bits ********************************** * * * EQU des ftypes * * * ********************************** SUBR0 EQU 1 SUBR a 0 arg SUBR1 EQU 2 SUBR2 EQU 3 SUBR3 EQU 4 SUBRN EQU 5 SUBRF EQU 6 EXPR EQU 7 FEXPR EQU 8 MACRO EQU 9 SUBRV1 EQU 10 SUBRV2 EQU 11 SUBRV3 EQU 12 SUBRVN EQU 13 ************************************* * * * EQU des marqueurs * * * ************************************* * marqueurs de pile MK_EVAL EQU $FFFFFFF0 MK_READ EQU $FFFFFFF1 MK_SUBRN EQU $FFFFFFF2 MK_MAP EQU $FFFFFFF3 ***************************************************************** * * * MACROS qui initialisent les bornes des zones pour * * D4=r6=BSTRG, D5=r7=NIL, D6=r8=BVAR, D7=r9=BCONS * * * ***************************************************************** SETBSTRG MACRO movl \1,r6 ENDM SETNIL MACRO movl \1,r7 ENDM SETBVAR MACRO movl \1,r8 ENDM SETBCONS MACRO movl \1,r9 ENDM *************************************************** * * * MACROS de test de type : * * utilise D4=r6=BSTRG, D5=r7=NIL, D6=r8=BVAR, D7=r9=BCONS * * * *************************************************** * Attention le VAX realise les tests a l'envers * du MC68000 !!! * BTNUMB[.S] ea,lab BTNUMB MACRO cmpl r6,\1 jgtr \2 ENDM * BFNUMB[.S] ea,lab BFNUMB MACRO cmpl r6,\1 jleq \2 ENDM * BTSTRG[.S] ea,lab BTSTRG MACRO cmpl r6,\1 jgtr \@ cmpl r7,\1 jgtr \2 \@ ENDM * BFSTRG[.S] ea,lab BFSTRG MACRO cmpl r6,\1 jgtr \2 cmpl r7,\1 jleq \2 ENDM * BTNIL[.S] ea,lab BTNIL MACRO cmpl r7,\1 jeql \2 ENDM * BFNIL[.S] ea,lab BFNIL MACRO cmpl r7,\1 jneq \2 ENDM * BTCST[.S] ea,lab BTCST MACRO cmpl r8,\1 jgtr \2 ENDM * BFCST[.S] ea,lab BFCST MACRO cmpl r8,\1 jleq \2 ENDM * BTSYMB[.S] ea,lab * attention a la double evaluation de BTSYMB MACRO cmpl r7,\1 jgtr \@ cmpl r9,\1 jgtr \2 \@ ENDM * BFSYMB.[S] ea,lab * attention a la double evaluation de BFSYMB MACRO cmpl r7,\1 jgtr \2 cmpl r9,\1 jleq \2 ENDM * BTVAR[.S] ea,lab * attention a la double evaluation de BTVAR MACRO cmpl r8,\1 jgtr \@ cmpl r9,\1 jgtr \2 \@ ENDM * BFVAR.[S] ea,lab * attention a la double evaluation de BFVAR MACRO cmpl r8,\1 jgtr \2 cmpl r9,\1 jleq \2 ENDM * BTCONS[.S] ea,lab BTCONS MACRO cmpl r9,\1 jleq \2 ENDM * BFCONS[.S] ea,lab BFCONS MACRO cmpl r9,\1 jgtr \2 ENDM ******************************************** * * Manipulations de la pile * ******************************************** * STACK ea sauve la valeur du pointeur de pile STACK MACRO movl r14,\1 ENDM * SSTACK ea change la valeur du pointeur de pile SSTACK MACRO movl \1,r14 ENDM * CHKSTK val,lab test le debordement de pile CHKSTK MACRO cmpl r14,\1 jleq \2 ENDM * PUSH ea,sp empile un pointeur PUSH MACRO IFC '\2','' pushl \1 ENDC IFNC '\2','' movl \1,-(\2) ENDC ENDM * PUSHAD ea empile une constante adresse PUSHAD MACRO pushal \1 ENDM * POP ea,sp depile un pointeur POP MACRO IFC '','\2' movl (r14)+,\1 ENDC IFNC '\2','' movl (\2)+,\1 ENDC ENDM * TOPST ea,sp consulte le sommet de pile TOPST MACRO IFC '\2','' movl (r14),\1 ENDC IFNC '\2','' movl (\2),\1 ENDC ENDM * XTOPST ea,sp echange du sommet de pile avec ea * utilise le reg auxiliaire r0 XTOPST MACRO IFC '\2','' movl (r14),r0 movl \1,(r14) movl r0,\1 ENDC IFNC '\2','' movl (\2),r0 movl \1,(\2) movl r0,\1 ENDC ENDM * ADJSTK ajuste la pile * SP = SP + TOPST ADJSTK MACRO ashl $2,(r14)+,r0 addl2 r0,r14 et voila. ENDM * CALL adr appel d'un sous-programme CALL MACRO jsb \1 ENDM * JCALL adr appel d'un sous-programme externe JCALL MACRO jsb \1 ENDM * RETURN retour d'un sous-programme RETURN MACRO rsb ENDM **************************************** * * * Autres MACROS d'acces * * * **************************************** * MOV s,d pour ne pas oublier le .L MOV MACRO movl \1,\2 ENDM * MOVB s,d idem pour un octet MOVB MACRO movb \1,\2 ENDM * MOVAD s,d pour charger une adresse MOVAD MACRO moval \1,\2 ENDM * MOVNIL d charge NIL dans la destination MOVNIL MACRO movl r7,\1 ENDM * GFTYPE s,d FTYPE(s) -> d GFTYPE MACRO movzbl FTYPE(\1),\2 ENDM * SFTYPE s,d s -> FTYPE(d) SFTYPE MACRO movb \1,FTYPE(\2) ENDM * GPTYPE s,d PTYPE(s) -> d GPTYPE MACRO movzbl PTYPE(\1),\2 ENDM * SPTYPE s,d s -> PTYPE(d) SPTYPE MACRO movb \1,PTYPE(\2) ENDM * SSPTYPE s force le bit : symbol special SSPTYPE MACRO bisb2 $0x80,PTYPE(\1) ENDM * BTSPTYPE s,lab br si le bitsymbole special est positinne BTSPTYPE MACRO bitb $0x80,PTYPE(\1) jneq \2 Z=0 si bit a 0 ENDM * GPLEN s,d PLEN(s) -> d GPLEN MACRO movzwl PLEN(\1),\2 ENDM * SPLEN s,d s -> PLEN(d) SPLEN MACRO movw \1,PLEN(\2) ENDM * JUMPI op realise un branchement au tavers un * registre JUMPI MACRO jmp (\1) ENDM * JUMPX table,index realise un branchement * indirect (table) indexe (index) JUMPX MACRO movl \1[\2],r0 jmp (r0) ENDM * MOVX source,base,index source -> base(index) * permet de manipuler des tables de doubles mots MOVX MACRO vraiment elle est a refaire. movl \3,r0 movl \1,*$\2[r0] ENDM * MOVBX source,base,index source -> base(index) * permet de manipuler des tables d'octets MOVBX MACRO movl \3,r0 movb \1,*$\2[r0] ENDM * XMOV index,base,dest base(index) -> dest * permet de manipuler des tables de doubles mots XMOV MACRO celle-la aussi! movl *$\2[\1],\3 ENDM * XMOVB index,base,dest base(index) -> dest * permet de manipuler des tables d'octets XMOVB MACRO celle-la aussi! movzbl *$\2[\1],\3 ENDM * MOVXSP source,index source -> SP(index+1) * permet de manipuler directement la pile MOVXSP MACRO vraiment elle est a refaire. movl \2,r0 incl r0 movl \1,(r14)[r0] ENDM * XSPMOV index,dest SP(index+1) -> dest * permet de manipuler directement la pile XSPMOV MACRO celle-la aussi! movl \1,r0 incl r0 movl (r14)[r0],\2 ENDM *************************************************** * * * Comparaisons de pointeurs * * * *************************************************** * BTEQ ae1,ae2,lab test l'egalite de 2 pointeurs BTEQ MACRO cmpl \2,\1 jeql \3 ENDM * BFEQ ae1,ae2,lab test l'inegalite de 2 pointeurs BFEQ MACRO cmpl \2,\1 jneq \3 ENDM *************************************************** * * * Acces aux valeurs numeriques * * * *************************************************** * VALNB Ax,Dy valeur de Ax -> Dy VALNB MACRO cvtwl \1,\2 ENDM * CRANB Dy,Ax interne la valeur Dy -> Ax CRANB MACRO andl2 $0x0000FFFF,\1 movl \1,\2 ENDM *************************************************** * * * Comparaisons arithmetiques * * * *************************************************** * CBxx actuellement sur 32 bits, bientot sur 16 bits CBEQ MACRO cmpl \1,\2 jeql \3 ENDM CBNE MACRO cmpl \1,\2 jneq \3 ENDM CBLT MACRO cmpl \1,\2 jlss \3 ENDM CBLE MACRO cmpl \1,\2 jleq \3 ENDM CBGT MACRO cmpl \1,\2 jgtr \3 ENDM CBGE MACRO cmpl \1,\2 jgeq \3 ENDM ********************************************** * * * Les instuctions numeriques * * * ********************************************** * INCR reg[,lab] INCR MACRO IFC '\2','' incl \1 ENDC IFNC '\2','' incw \1 jvs \2 ENDC ENDM * DECR reg[,lab] DECR MACRO IFC '\2','' decl \1 ENDC IFNC '\2','' decw \1 jvs \2 ENDC ENDM * PLUS op1,op2[,lab] op1 + op2 -> op2 PLUS MACRO IFC '\3','' addl2 \1,\2 ENDC IFNC '\3','' addw2 \1,\2 jvs \3 ENDC ENDM * DIFF op1,op2[,lab] op2 - op1 -> op2 DIFF MACRO IFC '\3','' subl2 \1,\2 ENDC IFNC '\3','' subw2 \1,\2 jvs \3 ENDC ENDM * NEGATE op1 NEGATE MACRO mnegw \1,\1 ENDM * TIMES op1,op2,lab op1 * op2 -> op2 TIMES MACRO mulw2 \1,\2 jvs \3 ENDM * QUO op1,op2,lab op1 / op2 -> op2 QUO MACRO divw2 \1,\2 IFNC '\3','' jvs \3 ENDC ENDM * REM op1,op2,lab op1 \ op2 -> op2 REM MACRO * a faire ?!?!?!?!? ENDM *************************************************** * * * Les instructions logiques * * * *************************************************** * LOR op1,op2 op1 OR op2 -> op2 LOR MACRO bisw2 \1,\2 ENDM * LXOR op1,op2 op1 XOR op2 -> op2 LXOR MACRO xorw2 \1,\2 ENDM * LAND op1,op2 op1 AND op2 -> op2 LAND MACRO mcomw \1,r0 bicw2 r0,\2 ENDM *************************************************** * * * Les instructions sur champ de bits * * * *************************************************** * LBYTE op1,op2,lab left-byte (op1) -> op2 * vers lab si op2 = 0 LBYTE MACRO rotl $-8,\1,\2 bicl2 $0xFFFFFF00,\2 IFNC '\3','' beql \3 ENDC ENDM * RBYTE op1,op2,lab right-byte (op1) -> op2 * vers lab si op2 = 0 RBYTE MACRO movl \1,\2 bicl2 $0xFFFFFF00,\2 IFNC '\3','' jeql \3 ENDC ENDM ********************************************** * * * L'operateur de boucle * * * ********************************************** * SOBGEZ reg,lab reg<-reg-1; si reg >= 0 branch a lab SOBGEZ MACRO sobgeq \1,\2 ENDM ********************************************** * * * CONStructions des doublets * * on suppose FREE = A6=r5 * * * ********************************************** * NCONS car car <- (car) NCONS MACRO cmpl r5,r7 FREE = NIL ? jneq \@ non : on peut construire jsb GC appel du GC \@ movl \1,CAR(r5) movl r5,\1 movl CDR(r5),r5 movl r7,CDR(\1) ENDM * XCONS cdr,car car <- (car . cdr) XCONS MACRO cmpl r5,r7 FREE = NIL ? jneq \@ non jsb GC \@ movl \2,CAR(r5) movl r5,\2 movl CDR(r5),r5 movl \1,CDR(\2) ENDM * CONS car,cdr cdr <- (car .cdr) * utilise le reg auxiliaire r0 CONS MACRO cmpl r5,r7 FREE = NIL ? jneq \@ non jsb GC \@ movl r5,r0 movl \1,CAR(r5) movl CDR(r5),r5 movl \2,CDR(r0) movl r0,\2 ENDM ************************************** * * * Gestion des symboles * * * ************************************** * FENTRY nom,type declaration d'un point d'entree * reserve un mot de type .XXX qui contiendra l'adresse * du symbole XXX, prepare l'adresse de la fonction XXX * de type XDEF et prepare le ftype ._XXX FENTRY MACRO .data .\1 .long 0 ._\1 EQU \2 .text .globl \1 \1 EQU * ENDM * MAKFNT nom,ptype,pkg,plen,pname * suppose : D5=r7=NIL, D4=r6=UNDEF, D2=r12=currentsymbole * r0=zonatm MAKFNT MACRO movl CSYMB,r0 charge la base des symboles movl r0,.\1 adresse du symbole movl r0,r12 pour BUILDAT movl r6,(r0)+ CVAL = UNDEF movl r7,(r0)+ PLIST = NIL moval \1,A1 adr de la fnt movl A1,(r0)+ FVAL = adresse de la routine movl \3,(r0)+ PKGC jsb BUILDAT .byte ._\1 FTYPE .byte \2 PTYPE .word \4 PLEN .ascii \5 PNAME ENDM * MAKFNTS nom,ptype,pkg,plen,pname idem mais PNAME en HEXA * suppose : D5=r7=NIL, D4=r6=UNDEF, D2=r12=currentsymbole * r0=zonatm MAKFNTS MACRO movl CSYMB,r0 charge la base des symboles movl r0,.\1 adresse du symbole movl r0,r12 pour BUILDAT movl r6,(r0)+ CVAL = UNDEF movl r7,(r0)+ PLIST = NIL moval \1,A1 adr de la fnt movl A1,(r0)+ FVAL = adresse de la routine movl \3,(r0)+ PKGC jsb BUILDAT .byte ._\1 FTYPE .byte \2 PTYPE .word \4 PLEN .byte \5 PNAME IFNC '\6','' .byte \6 suite du PNAME ENDC IFNC '\7','' .byte \7 suite du PNAME ENDC ENDM * MAKCST nom,ptype,pkgc,plen,pname * suppose : D5=r7=NIL, D4=r6=UNDEF, D2=r12=currentsymbole * r0=zonatm MAKCST MACRO .data .\1 .long 0 adresse du nom .text movl CSYMB,r0 base de chargement movl r0,.\1 adresse du symbole movl r0,r12 pour BUILDAT movl r0,(r0)+ CVAL = l'adresse du symbole movl r7,(r0)+ PLIST = NIL clrl (r0)+ FVAL = 0 movl \3,(r0)+ PKGC jsb BUILDAT .word \2 FTYPE (=0) + PTYPE .word \4 PLEN .ascii \5 PNAME ENDM * MAKCSTS nom,ptype,pkgc,plen,pname idem mais PNAME en hexa * suppose : D5=r7=NIL, D4=r6=UNDEF, D2=r12=currentsymbole * r0=zonatm MAKCSTS MACRO .data .\1 .long 0 adresse du nom .text movl CSYMB,r0 base de chargement movl r0,.\1 adresse du symbole movl r0,r12 pour BUILDAT movl r0,(r0)+ CVAL = l'adresse du symbole movl r7,(r0)+ PLIST = NIL clrl (r0)+ FVAL = 0 movl \3,(r0)+ PKGC jsb BUILDAT .word \2 FTYPE (=0) + PTYPE .word \4 PLEN .byte \5 PNAME IFNC '\6','' .byte \6 suite du PNAME ENDC IFNC '\7','' .byte \7 suite du PNAME ENDC ENDM * MAKVOID nom,ptype : fabrique le symbole vide * suppose : D5=r7=NIL, D4=r6=UNDEF, D2=r12=currentsymbole * r0=zonatm MAKVOID MACRO .data .\1 .long 0 adresse du nom .text movl CSYMB,r0 base de chargement movl r0,.\1 adresse du symbole movl r0,r12 pour BUILDAT movl r0,(r0)+ CVAL = l'adresse du symbole movl r7,(r0)+ PLIST = NIL clrl (r0)+ FVAL = 0 movl .VOID,(r0)+ PKGC jsb BUILDAT .word \2 FTYPE (=0) + PTYPE .word 0 PLEN ENDM * MAKSTRG size,adrbuff * fabrique une (nouvelle) chaine de caracteres MAKSTRG MACRO movl \1,r10 moval \2,r0 jsb CRASTRG ENDM * INTERN size,adrbuff INTERN MACRO movl \1,r10 moval \2,r0 jsb TRYATOM ENDM * PNAM p,e,i PLEN(A1)->p PNAME(A1)->e[i] * si i n'est pas fourni, i=0 (index dans \2) * appel de GEPNAM avec : * A1 l'atome, r0 l'adresse, D0 l'index PNAM MACRO moval \2,r0 IFC '\3','' clrl r10 ENDC IFNC '\3','' movl \3,r10 ENDC jsb GETPNAM movl r11,\1 ENDM * UPCASE d conversion lower -> upper case UPCASE MACRO cmpl \1,$0x61 'a' minuscule ? jlss \@ cmpl \1,$0x7A 'z' jgtr \@ subl2 $0x20,\1 passage en maj \@ ENDM * LWCASE d conversion upper -> lower case LWCASE MACRO cmpl \1,$0x41 'A' majuscule jlss \@ cmpl \1,$0x5A 'Z' jgtr \@ addl2 $0x20,\1 passage en min \@ ENDM **************************************** * * Les fonctions systeme * **************************************** * RUNTIME op retourne le runtime RUNTIME MACRO .globl ll_runt jsb ll_runt movl r0,\1 ENDM ***************************************** * * * Les pseudos de LLM3 * * * ***************************************** * TITRE nom,texte TITRE MACRO ENDM * PAGE PAGE MACRO ENDM * LIST LIST MACRO ENDM * NOLIST NOLIST MACRO ENDM * PURE PURE MACRO .text ENDM * IMPURE IMPURE MACRO .data ENDM * ADR adresse ADR MACRO .long \1 ENDM BYTE MACRO .byte \1 ENDM DSADR MACRO .space \1*4 ENDM DSBYTE MACRO .space \1 ENDM ASCII MACRO .ascii \1 ENDM ***************************************** * * * Les I/O minimum sur TTY * * * ***************************************** * TTYIN op1,op2 * car suiv dans op1, cc dans op2 TTYIN MACRO .globl LL_TTYI jsb LL_TTYI movl r10,\1 movl r0,\2 ENDM * TTYOUT op1,adr,op2 * sort la chaine de taille 'op1' et 'adr' * 'op2' = cc TTYOUT MACRO movl \1,r10 taille moval \2,r0 adresse .globl LL_TTYO jsb LL_TTYO movl r0,\3 ENDM * MSG len,adr sort le message * qui est un operande immediat MSG MACRO jbr B\@ M\@ .asciz \2 B\@ movl $\1,r10 taille moval M\@,r0 adresse jsb LL_TTYO ENDM * MSGCRLF retour chariot dans MSG MSGCRLF MACRO jbr B\@ M\@ .word 0x0D0A peut etre 'common' ?!?! B\@ movl $2,r10 taille moval M\@,r0 adresse jsb LL_TTYO ENDM * SNAP len,adr,reg permet de visualiser un registre SNAP MACRO .data S\@ .ascii \2 R\@ .ascii \3 .text .globl LL_TTYO,LL_TTYON movl $\1,r10 taille moval S\@,r0 adresse jsb LL_TTYO movl $2,r10 taille moval R\@,r0 adresse jsb LL_TTYO movl \3,r10 jsb LL_TTYON ENDM BRA MACRO jmp \1 ENDM BSR MACRO bsb \1 ENDM NOP MACRO NOP ENDM IDNT MACRO ENDM END MACRO ENDM XREF MACRO IFNC '\1','' .globl \1 ENDC IFNC '\2','' .globl \2 ENDC IFNC '\3','' .globl \3 ENDC IFNC '\4','' .globl \4 ENDC IFNC '\5','' .globl \5 ENDC IFNC '\6','' .globl \6 ENDC IFNC '\7','' .globl \7 ENDC IFNC '\8','' .globl \8 ENDC IFNC '\9','' .globl \9 ENDC ENDM XDEF MACRO IFNC '\1','' .globl \1 ENDC IFNC '\2','' .globl \2 ENDC IFNC '\3','' .globl \3 ENDC IFNC '\4','' .globl \4 ENDC IFNC '\5','' .globl \5 ENDC IFNC '\6','' .globl \6 ENDC IFNC '\7','' .globl \7 ENDC IFNC '\8','' .globl \8 ENDC IFNC '\9','' .globl \9 ENDC ENDM