; S P A L 1 1 . M A C ; ; Version modifiee le 12-MARS-82 ; ; 1) Changements dans $EXTB, $EXTH, $EXFD ; 2) Changements dans OF, OFB, OTHER, $E5, $E6 ; ;*** MACRO :GEN ;*** FONCTION :GENERATION D'UNE CHAINE DE CARACTERES ;*** P1,P2...P7:CHAINES A GENERER ;*** .MACRO GEN P1,P2,P3,P4,P5,P6,P7 P1'P2'P3'P4'P5'P6'P7 .ENDM .MACRO PUSH X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 .IRP X, MOV X,-(SP) .ENDR .ENDM .MACRO PULL X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 .IRP X, MOV (SP)+,X .ENDR .ENDM ;*** MACRO :$OP ;*** FONCTION:_SAUVEGARDER LE TYPE ET LE NUMERO ASSOCIES A LA STRUCTURE QUI ;*** EST INTERROMPUE ;*** _INCREMENTER LE COMPTEUR DE STRUCTURE ;*** _DONNER A LA NOUVELLE SRUCTURE LE NUMERO CORRESPONDANT A LA ;*** VALEUR DU COMPTEUR DE STUCTURE ;*** S1 :PARAMETRE SOURCE 1 :FOURNIT LE TYPE DE STRUCTURE QUE L'ON ;*** COMMENCE .MACRO $OP S1 ;*** SAUVEGARDER DU NUMERO DE STRUCTURE ET DE $A $I=$I+1 GEN $S1,\$I,=$SN+$A ;*** SAUVEGARDE DU TYPE GEN $S2,\$I,=$T ;*** INCREMENTER LE COMPTEUR DE STRUCTURE $C=$C+1 ;*** RENDRE LE NUMERO DE STRUCTURE EGAL AU COMPTEUR DE STRUCTURE $SN=$C $T=S1 ;*** INITIALISATION DE $A(FTER) $A=$AI ;*** GENERATION DU LABEL D'OUVERTURE GEN $,\$B+$SN,:NOP .=.-2 .ENDM ;*** MACRO :$CL ;*** FONCTION:TERMINER LA STRUCTURE EN COURS EN RESTITUANT LE TYPE ET LE ;*** NUMERO DE LA STRUCTURE QUI A ETE INTERROMPUE ;*** .MACRO $CL ;GENERATION DU LABEL DE FERMETURE GEN $,\$EX+$SN,:NOP .=.-2 GEN $SN=$S1,\$I $A=$SN/$F*$F $SN=$SN-$A GEN $T=$S2,\$I $I=$I-1 .ENDM .MACRO $OPER TYPE $OP TYPE $J=$J+1 GEN $SR,\$J,=$ERN+<$FIER*^O40000>+<$FCEX*^O20000> $ERNH=$ERN $FIER=0 $FCEX=0 $ERN=$SN .ENDM .MACRO $CLER GEN $ERN=$SR,\$J $FIER=$ERN/^O40000 $FCEX=$ERN/^O20000&1!$FCEX $ERN=$ERN&^O777 .IF NE $J-1 GEN $ERNH=$SR,\$J-1 $ERNH=$ERNH&^O777 .IFF $ERNH=0 .ENDC $J=$J-1 $CL .ENDM .MACRO $EQ LABEL BNE LABEL .ENDM .MACRO $NE LABEL BEQ LABEL .ENDM .MACRO $GE LABEL BLT LABEL .ENDM .MACRO $LT LABEL BGE LABEL .ENDM .MACRO $GT LABEL BLE LABEL .ENDM .MACRO $LE LABEL BGT LABEL .ENDM .MACRO $HI LABEL BLOS LABEL .ENDM .MACRO $LOS LABEL BHI LABEL .ENDM .MACRO $HIS LABEL BLO LABEL .ENDM .MACRO $LO LABEL BHIS LABEL .ENDM .MACRO $PL LABEL BMI LABEL .ENDM .MACRO $MI LABEL BPL LABEL .ENDM .MACRO $VC LABEL BVS LABEL .ENDM .MACRO $VS LABEL BVC LABEL .ENDM .MACRO $CC LABEL BCS LABEL .ENDM .MACRO $CS LABEL BCC LABEL .ENDM ;*** MACRO :GENTST ;*** FONCTION:GENERATION DE TEST CORRESPONDANT AUX PARAMETRES X1,X2,X3 ;*** GENERE EVENTUELLEMEN UNE INSTRUCTION CMP OU BIT OU TST ;*** SUIVIE D'UNE INSTRUCTION DE BRANCHEMENT CONDITIONNEL SUR COND. ;*** VERIFIEE OU SUR CONDITION NON VERIFIEE SELON LA VALEUR DE BC ;*** BC :=1 SI BRANCHEMENT SUR CONDITION VERIFIEE ;*** =0 SI BRANCHEMENT SUR CONDITION NON VERIFIEE ;*** LABEL ;LABEL ;*** X0 :=1 INSTRUCTION SUR OCTET ;*** :=0 INSTRUCTION SUR MOT ;*** X1 \ 3 PARAMETRES D'UNE CONDITION OU X2 ET X3 PEUVENT ETRE BLANC ;*** X2 > : LA CONDITION PEUT PRENDRE UNE DES FORMES SUIVANTES ;*** X3 / A EQ B /A EQ /EQ ;*** ;*** SI $NPAR=6 (ON A LA FORME A COND B,X2 EST LA CONDITION) ,GENERER UNE ;*** INSTRUCTION [ CMP ] OU [TEST ] SUIVIE DE L'INSTRUCTION DE BRANCHEMENT ;*** CONDITIONNEL APPROPRIEE ;*** TEST DU NOMBRE DE CARACTERES CONTENUS DANS LA CONDITION ;*** SI LE NOMBRE DE CARACTERES CONTENUS DANS LA CONDITION EST INFERIEUR ;*** OU EGAL A TROIS GENERER UNE INSTRUCTION [ CMP ] ;*** SI LE NOMBRE DE CARACTERES CONTENUS DANS LA CONDITION EST >3 ;*** (ON A UNE CONDITION SETON OU SETOFF) ,GENERER UNE INSTRUCTION [ BIT ] ;*** SI $NPAR=5 (ON A LA FORME: A COND) ,GENERER UNE INSTRUCTION [ TST ] ;*** SUIVIE DE L,INSTRUCTION DE BRANCHEMENT CONDITIONNEL APPROPRIEE ;*** SI LE NOMBRE DE PARAMETRES (X1,X2,X3) EST EGAL A 4: ;*** GENERER L'INSTRUCTION DE BRANCHEMENT CONDITIONNEL APPROPRIE ;*** SI LE NOMBRE DE PARAMETRES NON BLANCS N'EST NI =1 OU =2 OU 3 :ERREUR .MACRO $T2V1 LABEL,X1,X2,X3 CMPB X1,X3 B'X2 LABEL .ENDM .MACRO $T2V2 LABEL,X1, X2,X3 CMP X1,X3 B'X2 LABEL .ENDM .MACRO $T2NV1 LABEL,X1,X2,X3 CMPB X1,X3 $'X2 LABEL .ENDM .MACRO $T2NV2 LABEL,X1,X2,X3 CMP X1,X3 $'X2 LABEL .ENDM .MACRO $T3V1 LABEL,X1,X2,X3 BITB X1,X3 .IF IDN SETON,X2 BNE LABEL .IFF .IIF DIF SETOFF,X2, .ERROR ;X2 : ILLEGAL COMPARISON OPERATOR BEQ LABEL .ENDC .ENDM .MACRO $T3V2 LABEL,X1,X2,X3 BIT X1,X3 .IF IDN SETON,X2 BNE LABEL .IFF .IIF DIF SETOFF,X2, .ERROR ;X2 : ILLEGAL COMPARISON OPERATOR BEQ LABEL .ENDC .ENDM .MACRO $T3NV1 LABEL,X1,X2,X3 BITB X1,X3 .IF IDN SETON,X2 BEQ LABEL .IFF .IIF DIF SETOFF,X2, .ERROR ;X2 : ILLEGAL COMPARISON OPERATOR BNE LABEL .ENDC .ENDM .MACRO $T3NV2 LABEL,X1,X2,X3 BIT X1,X3 .IF IDN SETON,X2 BEQ LABEL .IFF .IIF DIF SETOFF,X2, .ERROR ;X2 : ILLEGAL COMPARISON OPERATOR BNE LABEL .ENDC .ENDM .MACRO $T1V1 LABEL,X1,X2,X3 TSTB X1 B'X2 LABEL .ENDM .MACRO $T1V2 LABEL,X1,X2,X3 TST X1 B'X2 LABEL .ENDM .MACRO $T1NV1 LABEL,X1,X2,X3 TSTB X1 $'X2 LABEL .ENDM .MACRO $T1NV2 LABEL,X1,X2,X3 TST X1 $'X2 LABEL .ENDM .MACRO $T0V1 LABEL,X1,X2,X3 B'X1 LABEL .ENDM .MACRO $T0V2 LABEL,X1,X2,X3 B'X1 LABEL .ENDM .MACRO $T0NV1 LABEL,X1,X2,X3 $'X1 LABEL .ENDM .MACRO $T0NV2 LABEL,X1,X2,X3 $'X1 LABEL .ENDM ;*** MACROS :$SHORT/$LONG ;*** FONCTION :GENERATION D'UNE SERIE DE TESTS SEPARES PAR DES OPERATEURS ;*** :LOGIQUES ;*** BC :CAS DE BRANCHEMENT=$V SI BRANCH. SUR CONDITION VERIFIEE ;*** : =$NV _ _ _ _ _ _ _ _ _ _ _ _ NON VERIFIEE ;*** LBLEX :LABEL (SPAL11) SORTIE (RUPTURE DE SEQUENCE) ;*** X0 :=1 :INSTRUCTION SUR OCTET ;*** :=2 :- - - - - - - - MOT ;*** P1 :PARAMETRE REPRESENTANT LA CONDITION :EX: ;*** P2 :---------------------- L'OPERATEUR LOGIQUE [ OR,AND ] ;*** $BWS :RECOIT 1 SI PROCHAINE CONDITION SUR OCTET ;*** :- - - 2 - - - - - - - - - - - - - - MOT .MACRO $LONG BC,LBLEX,X0,P1,P2 $'P2'L BC,LBLEX,X0,P1 .ENDM .MACRO $L BC,LBLEX,X0,X1,X2,X3 ;*** SI PAS D'OPERATEUR LOGIQUE : FIN DE TEST COMPOSE .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9002$,X1,X2,X3> .ENDC 9001$:NOP .=.-2 GEN < JMP $>,\LBLEX+$SN 9002$:NOP .=.-2 .ENDM .MACRO $ORL BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9002$,X1,X2,X3> .ENDC $BWS=2 .ENDM .MACRO $ANDL BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9001$,X1,X2,X3> .ENDC $BWS=2 .ENDM .MACRO $ORBL BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9002$,X1,X2,X3> .ENDC $BWS=1 .ENDM .MACRO $ANDBL BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9001$,X1,X2,X3> .ENDC $BWS=1 .ENDM .MACRO $SHORT BC,LBLEX,X0,P1,P2 $'P2'S BC,LBLEX,X0,P1 .ENDM .MACRO $S BC,LBLEX,X0,X1,X2,X3 ;*** SI PAS D'OPERATEUR LOGIQUE : FIN DE TEST COMPOSE .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< $>,\LBLEX+$SN,<,X1,X2,X3> .ENDC 9002$:NOP .=.-2 .ENDM .MACRO $ORS BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9002$,X1,X2,X3> .ENDC $BWS=2 .ENDM .MACRO $ORBS BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< 9002$,X1,X2,X3> .ENDC $BWS=1 .ENDM .MACRO $ANDS BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< $>,\LBLEX+$SN,<,X1,X2,X3> .ENDC $BWS=2 .ENDM .MACRO $ANDBS BC,LBLEX,X0,X1,X2,X3 .NARG $NPAR .NCHR $NCCND,X2 .IF GT $NPAR-6 .ERROR ;*** INVALID NUMBER OF PARAMETERS .IFF GEN < $T>,\$NCCND/4+$NPAR-4&3,,\X0,< $>,\LBLEX+$SN,<,X1,X2,X3> .ENDC $BWS=1 .ENDM ;*** MACRO :$MT ;*** FONCTION :GENERER LA SUITE DE TESTS DEMANDEE PAR L'UTILISATEUR ;*** BC :CAS DE BRANCHEMENT ;*** LBL :LABEL DE BRANCHEMENT ;*** X0 :=1 PREMIERE CONDITION SUR OCTET ;*** :=2 - - - - - - - - - - - MOT ;*** P1 :SUITE DE CONDITION ;*** OFFSET :=SHORT :LBL ACCESSIBLE PAR UNE INSTRUCTION BRANCH ;*** :=LONG :- - NON ACCESSIBLE PAR UNE INSTRUCTION BRANCH ; .MACRO $MT BC,LBL,X0,OFFSET=SHORT,P1 $BWS=X0 .IRP XNXM, $'OFFSET BC,LBL,$BWS,XNXM .ENDM .ENDM ;*** MACRO :BEGIN ;*** FONCTION :DEBUTER UNE INSTRUCTION QUI ,DANS LE CAS OU UN PARAMETRE EST ;*** PRESENT ,PEUT ETRE APPELER A NOUVEAU ;*** P1 :LABEL DE L'INSTRUCTION ;*** SI CE PARAMETRE EST PRESENT ,L'INSTRUCTION POURRA ETRE ;*** APPELER A NOUVEAU PAR: DO P1 ; .MACRO BEGIN P1,P2,P3,P4 .IF B P1 $OP $TYPINS .IFF .IF IDN , $OPER $TYPINS .IFF GEN < MOV #$>,\$EX+$C+1,<,-(SP)> .IF EQ $ERN $OP $TYPIR .IFF $OPER $TYPIR .ENDC .IIF DF,$'P1,.IIF NE,$'P1-$SN, .ERROR ;MULTIPLE DEFINITION OF P1 $'P1=$SN BEGIN P2,P3,P4 .ENDC .ENDC .ENDM ;*** MACRO :ENDINS ;*** FONCTION :TERMINER L'INSTRUCTION COMPOSEE DEBUTEE PAR BEGIN ;*** :SI LE TYPE=$TYPIR,GENERER :RTS PC ;*** P1 :LABEL QUI DOIT ETRE LE MEME QUE CELUI QUI NOMME L'INSTRUCTION ; .MACRO ENDINS P1 .IF EQ $T-$TYPINS $E1 P1 .MEXIT .ENDC .IF EQ $T-$TYPIR $E2 P1 .MEXIT .ENDC .ERROR ;END TYPE NOT AVAILABLE .ENDM .MACRO $E1 P1 $R0=$SN .IF EQ $ERN-$SN .IF EQ $FIER .IF NE $FCEX .ERROR ;NO ERROR BLOCK .ENDC .ENDC $CLER .IFF $CL .ENDC .IF EQ $T-$TYPIR $E2 P1 .IFF .IIF NB,P1, $TSTL P1,\$B+$R0 .ENDC .ENDM .MACRO $E2 P1 .IIF NB,P1, $TSTL P1+4,\$B+$SN RTS PC .IF NE $FCEX GEN $,\$ER+$ERN,:NOP .=.-2 ADD #2,(SP) MOV @(SP)+,PC ;*** 'NATURE DE LA PROCEDURE' =1 =>AVEC SORTIE D'ERREUR GEN $,\$NP+$SN,=1 $CLER BR .+4 GEN < $>,\$ER+$ERN .IFF ;*** 'NATURE DE LA PROCEDURE' =0 =>SANS SORTIE D'ERREUR GEN $,\$NP+$SN,=0 .IF NE $ERN-$SN $CL .IFF $CLER .ENDC .ENDC .ENDM ;*** MACRO :INVOKE ;*** FONCTION :EXECUTER UN BLOCK PRECEDEMMENT DECLARE ;*** LABEL :NOM DE L'INSTRUCTION A EXECUTER ; .MACRO INVOKE LABEL .IF NE $P .IF NDF $'LABEL .ERROR ;LABEL HAS NOT BEEN DEFINED IN A BEGIN name STATEMENT NOP NOP .MEXIT .ENDC .ENDC GEN < JSR PC,$>,\$B+$'LABEL+1 GEN $R0=$,\$NP+$'LABEL .IF NE $R0 .IF EQ $ERN .ERROR ;NO ERROR BLOCK .ENDC BR .+4 GEN < $>,\$ER+$ERN $FCEX=1 .ENDC .ENDM ;*** MACRO :ERROR ;*** FONCTION :OUVRIR UN BLOCK DE TRAITEMENT DES ERREURS ASSOCIE A UNE ;*** :SEQUENCE D'INSTRUCTIONS DEBUTEE PAR: "BEGIN WITH ERROR BLOCK" ;*** APPEL : ERROR BLOCK .MACRO ERROR A,LABEL,OFFSET=SHORT .IF DIF A,BLOCK .ERROR ;A # BLOCK .MEXIT .ENDC .IF NE <$ERN-$SN>+<$T-$TYPINS> .ERROR ;ERROR BLOCK FORBIDDEN OUT OF A BEGIN-BLOCK WITH ERROR BLOCK .MEXIT .ENDC .IF NE $FIER .ERROR ;ERROR BLOCK FORBIDDEN WITHIN AN ERROR BLOCK .MEXIT .ENDC ;*** FLAG `IN ERROR BLOCK' =1 $FIER=1 ;*** FLAG `CALL EXIT TO ERROR BLOCK' =0 $FCEX=0 $R0=0 GEN $R1=$S2,\$I .IIF EQ $R1-$TYPIR,$R0=4 .IIF NB,LABEL, $TSTL LABEL+$R0,\$B+$SN .IF IDN OFFSET,SHORT GEN
,\$EX+$SN .IFF GEN ,\$EX+$SN .ENDC GEN $,\$ER+$ERN,:NOP .=.-2 .ENDM ;*** MACRO :IF ;*** FONCTION :DEBUT DE LA STRUCTURE IF,THEN,ELSE,ENDIF ;*** .MACRO IF A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $OP $TYPIF $MT $NV,$A,2,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM .MACRO IFB A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $OP $TYPIF $MT $NV,$A,1,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM ;*** MACRO :THEN ;*** .MACRO THEN .ENDM ;*** MACRO :ELSE ;*** .MACRO ELSE OFFSET=SHORT .IF IDN OFFSET,SHORT GEN
,\$EX+$SN .IFF GEN < JMP $>,\$EX+$SN .ENDC GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F .ENDM ;*** MACRO :ENDIF ;*** .MACRO ENDIF P1 .IF NE $T-$TYPIF .ERROR ;END TYPE NOT AVAILABLE .IFF $E3 P1 .ENDC .ENDM .MACRO $E3 P1 .IIF NB,P1, $TSTL P1,\$B+$SN GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F $CL .ENDM ;*** MACRO :CASE ;*** FONCTION :DEBUT DE STRUCTURE CASE OF,OF....,OTHER,ENDCAS ; .MACRO CASE $OP $TYPCS $FOF=0 .ENDM ;*** MACRO :OF ; .MACRO OF A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET ;*** SI PREMIER OF DE LA STRUCTURE CASE .IF EQ $FOF-1 .IF NB,OFFSET .IF IDN OFFSET,LONG GEN < JMP $>,\$EX+$SN .IFF GEN
,\$EX+$SN .ENDC .IFF GEN
,\$EX+$SN .ENDC GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F .ENDC $FOF=1 $MT $NV,$A,2,OFFSET,<<
,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM .MACRO OFB A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET ;*** SI PREMIER OF DE LA STRUCTURE CASE .IF EQ $FOF-1 .IF NB,OFFSET .IF IDN OFFSET,LONG GEN < JMP $>,\$EX+$SN .IFF GEN
,\$EX+$SN .ENDC .IFF GEN
,\$EX+$SN .ENDC GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F .ENDC $FOF=1 $MT $NV,$A,1,OFFSET,<<
,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM ;*** MACRO :OTHER ;*** .MACRO OTHER OFSSET=SHORT .IF IDN OFFSET,LONG GEN < JMP $>,\$EX+$SN .IFF GEN
,\$EX+$SN .ENDC GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F .ENDM ;*** MACRO :ENDCAS ;*** .MACRO ENDCAS P1 .IF NE $T-$TYPCS .ERROR ;END TYPE NOT AVAILABLE .IFF $E4 P1 .ENDC .ENDM .MACRO $E4 P1 .IIF NB,P1, $TSTL P1,\$B+$SN GEN $,\$A+$SN,:NOP .=.-2 ;*** INCREMENTATION DE $A $A=$A+$F $CL .ENDM ;*** MACRO :WHILE ;*** FONCTION :DEBUT DE STRUCTURE WHILE,ENDWH ; .MACRO WHILE A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $OP $TYPWH .IF NB
$MT $NV,$EX,2,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDC .ENDM .MACRO WHILEB A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $OP $TYPWH .IF NB $MT $NV,$EX,1,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDC .ENDM ;*** MACRO :GIVE ; .MACRO GIVE A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $MT $NV,$EX,2,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM .MACRO GIVEB A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $MT $NV,$EX,1,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> .ENDM ;*** MACRO :ENDWH ; .MACRO ENDWH P1 .IF NE $T-$TYPWH .ERROR ;END TYPE NOT AVAILABLE .IFF $E5 P1 .ENDC .ENDM .MACRO $E5 P1 .IIF NB,P1, $TSTL P1,\$B+$SN .IRP X,\$B+$SN .IF LE, .-$'X-254. BR $'X .IFF JMP $'X .ENDC .ENDR $CL .ENDM ;*** MACRO :REPEAT ;*** FONCTION :DEBUT DE STRUCTURE REPEAT,UNTIL ; .MACRO REPEAT $OP $TYPRP .ENDM ;*** MACRO :ENDRP ; .MACRO ENDRP P1 .IF NE $T-$TYPRP .ERROR ;END TYPE NOT AVAILABLE .IFF $E6 P1 .ENDC .ENDM .MACRO $E6 P1 .IIF NB,P1, $TSTL P1,\$B+$SN .IRP X,\$B+$SN .IF LE, .-$'X-254. BR $'X .IFF JMP $'X .ENDC .ENDR $CL .ENDM ;*** MACRO :UNTIL ; .MACRO UNTIL A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $MT $NV,$B,2,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> $CL .ENDM .MACRO UNTILB A,B=^/>>;/,C,D=^/>>;/,E,F=^/>>;/,G,H=^/>>;/,I,K=^/>>;/,L,OFFSET $MT $NV,$B,1,OFFSET,<<,B>,<,D>,<,F>,<,H>,<,K>,<,>> $CL .ENDM ;MACRO :EXIT ; .MACRO EXIT A,B,C,D,E,F,G,H,I,J,K,L,M,N,OFFSET=SHORT $R0=0 .IF IDN,, $EXTB OFFSET D F H J L .ENDC .IF IDN,, $EXTH OFFSET E G I K M .ENDC .IF EQ,$R0 $EXFD OFFSET A C D> E G I K .ENDC .ENDM .MACRO $EXTB OFFSET,A,B,C,D,E,F,G,H,I,J,K,L $R0=1 .IF NE $FIER .ERROR ;EXIT TO ERROR BLOCK FORBIDDEN IN ERROR BLOCK .MEXIT .ENDC .IF EQ $ERN .ERROR ;NO ERROR BLOCK .MEXIT .ENDC $FCEX=1 .IIF NB,A, A ,C,,E,,G,,I,,K, .IF IDN, OFFSET,SHORT GEN
,\$ER+$ERN .IFF GEN ,\$ER+$ERN .ENDC .IIF NB,A, END .ENDM .MACRO $EXTH OFFSET,A,B,C,D,E,F,G,H,I,J,K,L $R0=1 .IF EQ $FIER .ERROR ;EXIT TO HIGHER ERROR BLOCK FORBIDDEN OUT OF ERROR BLOCK .MEXIT .ENDC .IF EQ $ERNH .ERROR ;NO HIGHER ERROR BLOCK .MEXIT .ENDC $FCEX=1 .IIF NB,A, A ,C,,E,,G,,I,,K, .IF IDN, OFFSET,SHORT GEN
,\$ER+$ERNH .IFF GEN ,\$ER+$ERNH .ENDC .IIF NB,A, END .ENDM .MACRO $EXFD OFFSET,A,B,C,D,E,F,G,H,I,J,K,L .IF EQ $SN .ERROR ;EXIT NOT WITHIN BLOCK .MEXIT .ENDC $R0=$SN .IIF NB,A, A ,C,,E,,G,,I,,K, .IF IDN, OFFSET,SHORT GEN
,\$EX+$R0 .IFF GEN ,\$EX+$R0 .ENDC .IIF NB,A, END .ENDM ;MACRO :END .MACRO END P1 GEN < $E>,\$T,< P1> .ENDM .MACRO $E0 .ERROR ;END OF UNOPEN STRUCTURE .ENDM ;*** MACRO :$TSTL ;*** FONCTION :VERIFIE SI LES 2 LABELS PASSES EN PARAMETRES SONT EGAUX ; .MACRO $TSTL P1,P2 .IF NE P1-$'P2 .ERROR ;P1 :WRONG LABEL .ENDC .ENDM ;*** MACRO :CHECK ;*** FONCTION :VERIFIE QUE TOUTES LES STRUCTURES SONT FERMEES ; .MACRO CHECK .IF NE $I $CHECK \$I .ENDC .ENDM .MACRO $CHECK A .ERROR ;NUMBER OF UNCLOSED STRUCTURES : A .ENDM ;*** MACRO :SPAL11 ;*** FONCTION:INITIALISATION DE TOUTES LES VARIABLES ET PARAMETRES ;*** NECESSAIRES AUX MACROS DE GENERATION DE STRUCTURES ;*** .MACRO SPAL11 P .MCALL PUSH,PULL .MCALL $T1V1,$T2V1,$T3V1,$T0V1,$T1NV1,$T2NV1,$T3NV1,$T0NV1 .MCALL $T1V2,$T2V2,$T3V2,$T0V2,$T1NV2,$T2NV2,$T3NV2,$T0NV2 .MCALL GEN,$EQ,$NE,$GE,$LT,$GT,$LE,$HI,$LOS,$HIS,$LO,$PL .MCALL $MI,$VC,$VS,$CC,$CS .MCALL $SHORT,$LONG,$MT,$OP,$CL,$OPER,$CLER,$CHECK,$TSTL .MCALL $ORL,$ORBL,$ANDL,$ANDBL,$ORS,$ORBS,$ANDS,$ANDBS,$L,$S .MCALL $EXFD,$EXTH,$EXTB .MCALL $E0,$E1,$E2,$E3,$E4,$E5,$E6 .MCALL BEGIN,INVOKE,ERROR,EXIT .MCALL IF,IFB,THEN,ELSE,END,CASE,OF,OFB,OTHER,WHILE,WHILEB,GIVE,GIVEB .MCALL REPEAT,UNTIL,UNTILB,ENDINS,ENDIF,ENDCAS,ENDWH,ENDRP,CHECK ;*** INITIALISATION DES PARAMETRES $TYPINS=1 $TYPIR=2 $TYPIF=3 $TYPCS=4 $TYPWH=5 $TYPRP=6 $V=1 $NV=0 $F=1000 $B=1*$F $ER=2*$F $NP=3*$F $AI=20*$F $EX=77*$F ;*** INITIALISATION DES VARIABLES $I=0 $C=0 $SN=0 $T=0 $A=$AI $J=0 $ERN=0 $FIER=0 $FCEX=0 $ERNH=0 ;*** INITIALISATION DU NUMERO DE PASSE .IF NDF,$P $P=0 .IFF $P=1 .ENDC .ENDM