( Assembleur PIC24, dsPIC30 et dsPIC33. Version 1.00 du 25 Mai 2014. Ecrit par jpb.forth . ) TELECHARGEMENT ( Assembleur utilisant les 32768 derniers octets de la memoire. Le compilateur passe en assembleur sur execution de l'instruction "ASSEMBLEUR" et repasse en compilateur en assemblant la directive "END" ou automatiquement a la fin du fichier. Cet assembleur gere 6 coeurs de processeurs MicroCHIP: PIC24F, PIC24H, PIC24E, dsPIC30F, dsPIC33F et dsPIC33E. Une directive assembleur specifique permet de choisir l'un de ces 6 coeurs. La liste des modes d'adressage possibles est la suivante : Wn [Wn] [Wn--] [Wn++] [--Wn] [++Wn] [Wn+Wm] [Wn+lit] f #lit #bit Expr Acc rPAG Wm*Wm Wn*Wm [Wn+=d] [Wn-=d] Wn est un registre avec n compris entre 0 et 15, W0=WREG W14=WFP et W15=WSP lit est un entier dont la taille varie en fonction des instructions f est une des premieres 8192 registres de 16 bits de la memoire vive avec 0=W0 bit est un numero de bit Expr est une adresse en memoire programme Acc est un accumulateur 40 bits A ou B rPAG est un registre de pagination DSRPAG, DSWPAG ou TBLPAG Wm*Wm est la mise au carre d'un avec m compris entre 4 et 7 Wn*Wm est la multiplication de 2 registres avec n et m compris entre 4 et 7 [Wn+=d] [Wn-=d] Pour toute information complementaire, consulter la documentation MICROCHIP. L'instruction "RAZ_ASSEMBLEUR" permet de reinitialiser la table des etiquettes. L'instruction "FORGET_ASSEMBLEUR" retire tout le vocabulaire dedie au programme d'assemblage. Cette instruction est a executer lorsqu'il n'y a plus d'instruction necessitant l'assembleur. ) HEX FORGET DEBUT_ASM HERE 10000 MEMOIRE_ALLOUE DUP 0= [IF] ECHO" MEMOIRE INSUFFISANTE POUR L'ASSEMBLEUR MICROFORTH!" DROP ABORT [THEN] DUP >HERE CONSTANT DEBUT_ASM CONSTANT ANCIEN_HERE DEBUT_ASM A000+ CONSTANT ETIQUETTES_ASM 0 VARIABLE ETQ_ASM 0 VARIABLE PAD_ASM 0 VARIABLE INIT_ASM 0 VARIABLE PASSE_ASM 0 VARIABLE >IN_ASM 0 VARIABLE HERE_ASM 0 VARIABLE POINTEUR_ASM 0 VARIABLE INDEX_ASM 0 VARIABLE MEM_HERE_ASM 0 VARIABLE ORG_ASM 0 VARIABLE PIC_ASM HERE 80 ALLOT CONSTANT TMP_ASM HERE 200 ALLOT CONSTANT TABLE_ASM : INS_TAB ( adr_s, adr_d --> - ) OVER OVER DICO_CHERCHE ?DUP IF 0> 4 AND + 1 3 PICK +2! DUP DUP 4+ 4 PICK DUP 2@ 4* + 3 PICK - CMOVE THEN >R DROP R> 2! ; : INS_ASM ( adr_s,code,adr_prgm --> - ) HERE >R ROT DUP >R DUP C@ FF AND 1+ DUP 1 AND + + R> DO I C@ C, LOOP 2, , R> TABLE_ASM INS_TAB ; : SP_TST_CAR ( car --> b a 0 si pas de car ) PAD 2@ >IN 2@ + C@ = IF 1 >IN +2! -1 ELSE 0 THEN ; : SP_TST_# ( - --> b a 0 si pas de # ) 23 SP_TST_CAR ; : SP_TST_, ( - --> b a 0 si pas de , ) 2C SP_TST_CAR ; : SP_TST_* ( - --> b a 0 si pas de * ) 2A SP_TST_CAR ; : SP_TST_+ ( - --> b a 0 si pas de + ) 2B SP_TST_CAR ; : SP_TST_- ( - --> b a 0 si pas de - ) 2D SP_TST_CAR ; : SP_TST_= ( - --> b a 0 si pas de = ) 3D SP_TST_CAR ; : SP_TST_[ ( - --> b a 0 si pas de [ ) 5B SP_TST_CAR ; : SP_TST_] ( - --> b a 0 si pas de ] ) 5D SP_TST_CAR ; : SP_TST_A ( - --> b a 0 si pas de A ) 41 SP_TST_CAR ; : SP_TST_B ( - --> b a 0 si pas de B ) 42 SP_TST_CAR ; : AF_LIGNE_ASM PAD 2@ >IN 2@ + BEGIN DUP 1- DUP PAD 2@ U< IF DROP -1 ELSE DUP C@ FF AND DUP 1F > SWAP 9 = OR IF >R DROP R> 0 ELSE DROP -1 THEN THEN UNTIL BEGIN DUP C@ DUP 3 = OVER D = OR NOT WHILE DUP 0< IF 81+ SPACES ELSE EMIT THEN 1+ REPEAT DROP DROP CR ; : MIROIR ( AABBCCDD --> DDCCBBAA ) SWAB DUP >R FF00FF00 AND -8 LSH R> FF00FF AND 8 LSH + ; : AF_CODE_ASM INDEX_ASM @ 0= IF PASSE_ASM @ IF MEM_HERE_ASM 2@ HERE OVER - BEGIN DUP 0> WHILE BASE @ >R HEX 3C EMIT OVER ORG_ASM 2@ + 2/ 0 <# DROP SWAP # # # # # # #> ( adresse sur 24 bits ) TYPE 3E EMIT DUP >R 4/ 8 MIN 0 DO SPACE DUP 2@ MIROIR 0 <# DROP SWAP # # # # # # # # #> ( code sur 32 bits ) TYPE 4+ LOOP CR R> 20- R> BASE ! REPEAT DROP DROP THEN HERE MEM_HERE_ASM 2! THEN ; : TAMPON_ASM ( - --> - ) PAD 2@ >IN 2@ + DUP C@ DUP 40 > SWAP 5B < AND IF TMP_ASM 0 OVER C! 1+ DUP 31+ SWAP DO DUP C@ DUP 5F = OVER 40 > 3 PICK 5B < AND OR OVER 2F > 3 PICK 3A < AND OR IF I C! 1+ 1 >IN +2! TMP_ASM DUP C@ 1+ SWAP C! ELSE DROP LEAVE THEN LOOP DROP ELSE AF_LIGNE_ASM ." **** Syntaxe incorrecte !" ABORT THEN ; : OPERANDE? PAD 2@ >IN 2@ + C@ DUP 0< OVER 20 = OR OVER 9 = OR IF 1 >IN +2! DUP 20 = SWAP 9 = OR IF PAD 2@ >IN 2@ BEGIN OVER OVER + C@ DUP 20 = SWAP 9 = OR IF 1+ 0 ELSE -1 THEN UNTIL >IN 2! DROP THEN ELSE DROP AF_LIGNE_ASM ." **** Oubli d'une operande !" ABORT THEN ; : MAUVAISE_INSTRUCTION AF_LIGNE_ASM ." **** Instruction incorrecte !" ABORT ; : MAUVAISE_OPERANDE AF_LIGNE_ASM ." **** Operande incorrecte !" ABORT ; : MAUVAIS_BRANCHEMENT AF_LIGNE_ASM ." **** Branchement trop long !" ABORT ; : INSERE_ETIQUETTE ( - --> - ) PASSE_ASM @ 0= IF TMP_ASM DUP ETIQUETTES_ASM DICO_CHERCHE IF DROP ETIQUETTES_ASM DUP 2@ 2+ 4* + POINTEUR_ASM 2@ 3 PICK C@ 5+ DUP 1 AND + - U< IF POINTEUR_ASM 2@ 4- MEM_HERE_ASM 2@ ORG_ASM 2@ + 2/ OVER 2! DUP >R OVER C@ 1+ DUP 1 AND + DUP >R - R@ CMOVE R> NEGATE R> + DUP POINTEUR_ASM 2! ETIQUETTES_ASM INS_TAB ELSE AF_LIGNE_ASM ." **** Impossible d'ajouter une etiquette !" ABORT THEN ELSE AF_LIGNE_ASM ." **** Etiquette deja declaree !" ABORT THEN THEN ; : DECODE_NOMBRE ( - --> n ) 0 2B ( + ) BEGIN PAD 2@ >IN 2@ + DUP C@ 24 = ( $ ) IF BASE @ >R HEX 0 SWAP CONVERT PAD 2@ - >IN 2! R> BASE ! ELSE DUP C@ 25 = ( % ) IF BASE @ >R BIN 0 SWAP CONVERT PAD 2@ - >IN 2! R> BASE ! ELSE DUP C@ 40 = ( @ ) IF BASE @ >R 8 BASE ! 0 SWAP CONVERT PAD 2@ - >IN 2! R> BASE ! ELSE DUP C@ 2A = ( * ) IF DROP 1 >IN +2! MEM_HERE_ASM 2@ 2/ ELSE DUP C@ 7E = ( ~ ) IF DROP 1 >IN +2! FIND PAD 2@ >IN 2@ + C@ 20 U< IF 1 >IN -2! THEN ?DUP IF EXECUTE ELSE AF_LIGNE_ASM ." **** Adresse FORTH introuvable !" ABORT THEN ELSE DUP C@ DUP 2F > OVER 3A < AND SWAP 2D = OR ( - ou de 0 a 9 ) IF BASE @ >R DECIMAL 0 SWAP 1- CONVERT PAD 2@ - >IN 2! R> BASE ! ELSE DROP TAMPON_ASM TMP_ASM ETIQUETTES_ASM DICO_CHERCHE IF DROP 0 -1 ETQ_ASM ! PASSE_ASM @ IF AF_LIGNE_ASM ." **** Etiquette non declaree !" ABORT THEN ELSE 2@ DUP C@ 1+ DUP 1 AND + + 2@ THEN THEN THEN THEN THEN THEN THEN ETQ_ASM @ IF DROP DROP ELSE SWAP DUP 2B = IF DROP + ELSE DUP 2D = IF DROP - ELSE DUP 2A = IF DROP * ELSE DUP 2F = IF DROP / ELSE DUP 7C = IF DROP OR ELSE DUP 5E = IF DROP XOR ELSE DUP 26 = IF DROP AND ELSE 3E = IF NEGATE THEN ASH THEN THEN THEN THEN THEN THEN THEN THEN PAD 2@ >IN 2@ + C@ DUP 2B = OVER 2D = OR OVER 2A = OR OVER 2F = OR OVER 7C = OR OVER 5E = OR OVER 26 = OR OVER 3C = OR OVER 3E = OR ( +,-,*,/,|,^,&,< ou > ) WHILE 1 >IN +2! REPEAT DROP ; : DECODE_WN ( - --> n 0 a 15 si OK ) -1 PAD 2@ >IN 2@ + DUP C@ 57 = ( W ) IF 1+ DUP C@ CASE 30 OF ( W0 ) >R 0 AND R> 1+ ENDOF 31 OF ( W1, W10, W12, W13, W14 ou W15 ) 1+ DUP C@ 26- DUP 10 U< OVER 9 > AND IF >R >R DROP R> R> SWAP 1+ ELSE DROP >R 1 AND R> THEN ENDOF 32 OF >R 2 AND R> 1+ ENDOF 33 OF >R 3 AND R> 1+ ENDOF 34 OF >R 4 AND R> 1+ ENDOF 35 OF >R 5 AND R> 1+ ENDOF 36 OF >R 6 AND R> 1+ ENDOF 37 OF >R 7 AND R> 1+ ENDOF 38 OF >R 8 AND R> 1+ ENDOF 39 OF >R 9 AND R> 1+ ENDOF 46 OF ( WFP = W14 ) 1+ DUP C@ 50 = IF >R E AND R> 1+ THEN ENDOF 52 OF ( WREG = W0 ) 1+ DUP C@ 45 = IF 1+ DUP C@ 47 = IF >R 0 AND R> 1+ THEN THEN ENDOF 53 OF ( WSP = W15 ) 1+ DUP C@ 50 = IF >R F AND R> 1+ THEN ENDOF ENDCASE OVER 10 U< IF PAD 2@ - >IN 2! ELSE DROP THEN ELSE DROP THEN ; ( mode: 0 --> Expr operande:nombre 1 --> # nombre 2 --> Wn,Wxd,Wyd n 0<=n<=15 3 --> [Wn] n 4 --> [Wn--] n 5 --> [Wn++] n 6 --> [--Wn] n 7 --> [++Wn] n 8 --> [Wn+Wm] n+(m<<11) 0<=m<=15 9 --> [Wn+-p] n+(p<<4) -1024<=p<=1023 10 --> Wn*Wn a 0<=a<=3 11 --> Wn*Wm b 0<=b<=7 12 --> [Wxd]+-=d ((xd&1)<<3)+(d>>1) d:{2,4,6} 13 --> [Wyd]+-=d ((yd&1)<<3)+(d>>1) 14 --> [W13]+=2 1 ) : ADRESSE_EFFECTIVE ( - --> operande,mode ) SP_TST_# IF 0 ETQ_ASM ! DECODE_NOMBRE 1 ELSE SP_TST_[ IF DECODE_WN DUP 10 U< IF SP_TST_] IF SP_TST_- IF SP_TST_= IF DECODE_NOMBRE DUP 2 = OVER 4 = OR OVER 6 = OR IF OVER 8 = 3 PICK 9 = OR IF >R 1 AND 3 LSH 10 R> - 2/ + C ELSE OVER A = 3 PICK B = OR IF >R 1 AND 3 LSH 10 R> - 2/ + D ELSE MAUVAISE_OPERANDE THEN THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE SP_TST_+ IF SP_TST_= IF DECODE_NOMBRE DUP 2 = OVER 4 = OR OVER 6 = OR IF OVER 8 = 3 PICK 9 = OR IF >R 1 AND 3 LSH R> 2/ + C ELSE OVER A = 3 PICK B = OR IF >R 1 AND 3 LSH R> 2/ + D ELSE OVER D = OVER 2 = AND IF DROP DROP 1 E ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE 3 THEN THEN ELSE SP_TST_- IF SP_TST_- IF SP_TST_] IF 4 ELSE MAUVAISE_OPERANDE THEN ELSE 0 ETQ_ASM ! DECODE_NOMBRE NEGATE 4 LSH + SP_TST_] IF 9 ELSE MAUVAISE_OPERANDE THEN THEN ELSE SP_TST_+ IF SP_TST_+ IF SP_TST_] IF 5 ELSE MAUVAISE_OPERANDE THEN ELSE DECODE_WN DUP 10 U< IF B LSH + SP_TST_] IF 8 ELSE MAUVAISE_OPERANDE THEN ELSE DROP 0 ETQ_ASM ! DECODE_NOMBRE 4 ASH + SP_TST_] IF 9 ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE DROP SP_TST_- IF SP_TST_- IF DECODE_WN DUP 10 U< IF SP_TST_] IF 6 ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE SP_TST_+ IF SP_TST_+ IF DECODE_WN DUP 10 U< IF SP_TST_] IF 7 ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE DECODE_WN DUP 10 U< IF SP_TST_* IF DECODE_WN DUP 10 U< IF OVER OVER = IF 3 > OVER 8 < AND IF 3 AND A ELSE MAUVAISE_OPERANDE THEN ELSE OVER 4 = IF DUP 4 > OVER 8 < AND IF >R DROP R> 5- B ELSE MAUVAISE_OPERANDE THEN ELSE OVER 5 = IF DUP 5 > OVER 8 < AND IF >R DROP R> 2- B ELSE MAUVAISE_OPERANDE THEN ELSE 7 = SWAP 6 = AND IF 6 B ELSE MAUVAISE_OPERANDE THEN THEN THEN THEN ELSE MAUVAISE_OPERANDE THEN ELSE 2 THEN ELSE DROP 0 ETQ_ASM ! DECODE_NOMBRE 0 THEN THEN THEN ; ( mode: 0 --> Wa*Wa operande:m<<16 0<=m<=3 1 --> Wa*Wb o<<16 0<=o<=7 2 --> Accu no<<15 no:{0,1} 3 --> Wx,Wy m<<10 0<=m<=3 4 --> [Wxd(+W12)](+/-=d) n<<6 0<=n<=15 5 --> [Wyd(+W12)](+/-=d) n<<2 6 --> [W13](+=2) no ) : ADRESSE_EFFECTIVE_DSP ( - --> operande,mode ) SP_TST_A IF 0 2 ELSE SP_TST_B IF 8000 2 ELSE ADRESSE_EFFECTIVE DUP A = IF >R 10 LSH R> A- ELSE DUP B = IF >R 10 LSH R> A- ELSE DUP 2 = IF OVER 3 > 3 PICK 8 < AND IF >R 4- A LSH R> 1+ ELSE OVER D = IF >R DUP XOR R> 4+ ELSE MAUVAISE_OPERANDE THEN THEN ELSE DUP 8 = IF DROP DUP [ C B LSH 9+ LITERAL ] = IF DROP 300 4 ELSE [ C B LSH B+ LITERAL ] = IF 30 5 ELSE MAUVAISE_OPERANDE THEN THEN ELSE DUP C = IF >R 6 LSH R> 8- ELSE DUP D = IF >R 4* R> 8- ELSE DUP E = IF 8- ELSE DUP 3 = IF DROP DUP 8 = OVER 9 = OR IF 1 AND 9 LSH 4 ELSE DUP A = OVER B = OR IF 1 AND 5 LSH 5 ELSE MAUVAISE_OPERANDE THEN THEN ELSE MAUVAISE_OPERANDE THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN ; ( codes suffixe: --> 1 .B --> 0 .C --> 3 .D --> 2 .L --> 2 .N --> 5 .R --> 6 .S --> 7 .SD --> 8 .SS --> 9 .SU --> 10 .U --> 11 .UD --> 12 .US --> 13 .UU --> 14 .W --> 1 .Z --> 4 ) : SP_SUFFIXE ( - --> suffixe ) PAD 2@ >IN 2@ + DUP C@ 2E = ( . ) IF 1+ C@ CASE 42 OF ( B ) 0 2 >IN +2! ENDOF 43 OF ( C ) 3 2 >IN +2! ENDOF 44 OF ( D ) 2 2 >IN +2! ENDOF 4C OF ( L ) 2 2 >IN +2! ENDOF 4E OF ( N ) 5 2 >IN +2! ENDOF 52 OF ( R ) 6 2 >IN +2! ENDOF 53 OF ( S ) 7 2 >IN +2! PAD 2@ >IN 2@ + C@ DUP 44 = IF DROP 1+ 1 >IN +2! ELSE DUP 53 = IF DROP 2+ 1 >IN +2! ELSE 55 = IF 3+ 1 >IN +2! THEN THEN THEN ENDOF 55 OF ( U ) B 2 >IN +2! PAD 2@ >IN 2@ + C@ DUP 44 = IF DROP 1+ 1 >IN +2! ELSE DUP 53 = IF DROP 2+ 1 >IN +2! ELSE 55 = IF 3+ 1 >IN +2! THEN THEN THEN ENDOF 57 OF ( W ) 1 2 >IN +2! ENDOF 5A OF ( Z ) 4 2 >IN +2! ENDOF -1 ENDCASE DUP 0< IF MAUVAISE_OPERANDE THEN ELSE DROP 1 THEN ; : SP_TAILLE ( - --> taille 0, 1 ou 2 ) SP_SUFFIXE DUP 2 > IF MAUVAISE_OPERANDE THEN ; HEX ( Directives d'assemblage ) : INST_DC ( 0 --> - ) DROP SP_TAILLE OPERANDE? 0 INDEX_ASM ! FFFFFF 0 BEGIN ADRESSE_EFFECTIVE 0= IF 4 PICK ?DUP IF 1- IF FFFFFF AND MIROIR 2, ELSE FFFF AND OVER IF SWAB ROT FFFF AND + FFFFFF AND MIROIR 2, DROP FFFFFF 0 ELSE ROT FF0000 AND + SWAP 2+ THEN THEN ELSE FF AND OVER ?DUP IF 1- ?DUP IF 1- IF DROP DROP MIROIR 2, FFFFFF 0 ELSE 10 LSH ROT FFFF AND + SWAP 1+ THEN ELSE 8 LSH ROT FF00FF AND + SWAP 1+ THEN ELSE ROT FFFF00 AND + SWAP 1+ THEN THEN ELSE MAUVAISE_OPERANDE THEN SP_TST_, 0= UNTIL IF FFFFFF AND MIROIR 2, ELSE DROP THEN DROP ; : INST_END ( 0 --> - ) DROP 0 INDEX_ASM ! PASSE_ASM @ 0= IF PAD_ASM 2@ PAD 2! >IN_ASM 2@ >IN 2! HERE_ASM 2@ DUP MEM_HERE_ASM 2! >HERE THEN 1 PASSE_ASM +! ; : INST_EQU ( 0 --> - ) DROP OPERANDE? ADRESSE_EFFECTIVE 0= ETQ_ASM @ 0= AND IF PASSE_ASM @ IF DROP ELSE POINTEUR_ASM 2@ DUP C@ 1+ DUP 1 AND + + 2! THEN EXIT THEN MAUVAISE_OPERANDE ; : INST_ORG ( 0 --> - ) DROP 0 INDEX_ASM ! OPERANDE? ADRESSE_EFFECTIVE 0= >R 2* DUP 2 AND 0= ETQ_ASM @ 0= AND R> AND IF MEM_HERE_ASM 2@ - ORG_ASM 2! EXIT THEN MAUVAISE_OPERANDE ; : INST_PIC ( masque_coeur --> - ) PIC_ASM ! ; : INST_RM ( 0 --> - ) DROP 0 INDEX_ASM ! SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE 0= ETQ_ASM @ 0= AND IF SWAP ?DUP IF 1- IF 4* ELSE 2* THEN THEN 3+ -4 AND ?DUP IF 0 DO FFFF00FF 2, 4 +LOOP THEN EXIT THEN MAUVAISE_OPERANDE ; ( Instructions ) : INST_CLRWDT ( code --> - ) 8 LSH MIROIR 2, ; : INST_LNK ( code --> - ) 8 LSH OPERANDE? ADRESSE_EFFECTIVE 1 = IF PASSE_ASM @ IF DUP 1 AND 0= OVER 4000 U< AND IF + ELSE MAUVAISE_OPERANDE THEN ELSE DROP 3FFE+ THEN MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_DISI ( code --> - ) 8 LSH OPERANDE? ADRESSE_EFFECTIVE 1 = IF PASSE_ASM @ IF DUP 4000 U< IF + ELSE MAUVAISE_OPERANDE THEN ELSE DROP 3FFF+ THEN MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_PWRSAV ( code --> - ) 8 LSH OPERANDE? ADRESSE_EFFECTIVE 1 = IF PASSE_ASM @ IF DUP 2 U< IF + ELSE MAUVAISE_OPERANDE THEN ELSE DROP 1+ THEN MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_BRA ( 0 --> - ) 1- OPERANDE? PAD 2@ >IN 2@ + DUP C@ CASE 43 OF ( C, ) 1+ DUP C@ 2C = IF >R DROP 310000 R> 1+ THEN ENDOF 47 OF ( GE, GEU, GT, GTU, ) 1+ DUP C@ DUP 45 = IF DROP 1+ DUP C@ DUP 2C = IF DROP >R DROP 3D0000 R> 1+ ELSE 55 = IF 1+ DUP C@ 2C = IF >R DROP 310000 R> 1+ THEN THEN THEN ELSE 54 = IF 1+ DUP C@ DUP 2C = IF DROP >R DROP 3C0000 R> 1+ ELSE 55 = IF 1+ DUP C@ 2C = IF >R DROP 3E0000 R> 1+ THEN THEN THEN THEN THEN ENDOF 4C OF ( LE, LEU, LT, LTU, ) 1+ DUP C@ DUP 45 = IF DROP 1+ DUP C@ DUP 2C = IF DROP >R DROP 340000 R> 1+ ELSE 55 = IF 1+ DUP C@ 2C = IF >R DROP 360000 R> 1+ THEN THEN THEN ELSE 54 = IF 1+ DUP C@ DUP 2C = IF DROP >R DROP 350000 R> 1+ ELSE 55 = IF 1+ DUP C@ 2C = IF >R DROP 390000 R> 1+ THEN THEN THEN THEN THEN ENDOF 4E OF ( N, NC, NN, NOV, NZ, ) 1+ DUP C@ DUP 2C = IF DROP >R DROP 330000 R> 1+ ELSE DUP 43 = IF DROP 1+ DUP C@ 2C = IF >R DROP 390000 R> 1+ THEN ELSE DUP 4E = IF DROP 1+ DUP C@ 2C = IF >R DROP 3B0000 R> 1+ THEN ELSE DUP 4F = IF DROP 1+ DUP C@ 56 = IF 1+ DUP C@ 2C = IF >R DROP 380000 R> 1+ THEN THEN ELSE 5A = IF 1+ DUP C@ 2C = IF >R DROP 3A0000 R> 1+ THEN THEN THEN THEN THEN THEN ENDOF 4F OF ( OA, OB, OV, ) 1+ DUP C@ DUP 41 = IF DROP PIC_ASM @ 38 AND IF 1+ DUP C@ 2C = IF >R DROP 0C0000 R> 1+ THEN THEN ELSE DUP 42 = IF DROP PIC_ASM @ 38 AND IF 1+ DUP C@ 2C = IF >R DROP 0D0000 R> 1+ THEN THEN ELSE 56 = IF 1+ DUP C@ 2C = IF >R DROP 300000 R> 1+ THEN THEN THEN THEN ENDOF 53 OF ( SA, SB, ) PIC_ASM @ 38 AND IF 1+ DUP C@ DUP 41 = IF DROP 1+ DUP C@ 2C = IF >R DROP 0E0000 R> 1+ THEN ELSE 42 = IF 1+ DUP C@ 2C = IF >R DROP 0F0000 R> 1+ THEN THEN THEN THEN ENDOF 5A OF ( Z, ) 1+ DUP C@ 2C = IF >R DROP 320000 R> 1+ THEN ENDOF ENDCASE OVER 1+ IF PAD 2@ - >IN 2! ELSE DROP DROP DECODE_WN DUP 10 U< IF PIC_ASM @ 24 AND IF 010600+ ELSE 016000+ THEN MIROIR 2, EXIT ELSE DROP 370000 THEN THEN ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF 2/ MEM_HERE_ASM 2@ ORG_ASM 2@ + 4+ 4/ - DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN FFFF AND + ELSE DROP FFFF+ THEN MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_CALL ( code --> - ) 8 LSH SP_TAILLE OPERANDE? DUP IF 1- IF PIC_ASM @ 24 AND IF DECODE_WN DUP 10 U< OVER 1 AND 0= AND IF >R 2/ 8000+ R@ + R> 1+ B LSH + MIROIR 2, EXIT THEN THEN ELSE DECODE_WN DUP 10 U< IF >R 2/ R> + MIROIR 2, EXIT ELSE DROP ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF DUP FF800001 AND 0= IF DUP >R FFFF AND + MIROIR 2, R> 7F0000 AND SWAB MIROIR 2, EXIT THEN ELSE DROP FFFF+ MIROIR 2, 7F0000 SWAB MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_DO ( code --> - ) 8 LSH OPERANDE? PIC_ASM @ 38 AND IF DECODE_WN DUP 10 U< IF + 8000+ MIROIR 2, SP_TST_, IF ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF 2/ MEM_HERE_ASM 2@ ORG_ASM 2@ + 8+ 4/ - DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN FFFF AND MIROIR ELSE DROP FFFF0000 THEN 2, EXIT THEN THEN ELSE DROP ADRESSE_EFFECTIVE 1 = IF DUP PIC_ASM @ 20 AND IF 8000 ELSE 4000 THEN U< IF + MIROIR 2, SP_TST_, IF ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF 2/ MEM_HERE_ASM 2@ ORG_ASM 2@ + 8+ 4/ - DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN FFFF AND MIROIR ELSE DROP FFFF0000 THEN 2, EXIT THEN THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_GOTO ( code --> - ) 8 LSH SP_TAILLE OPERANDE? DUP IF 1- IF PIC_ASM @ 24 AND IF DECODE_WN DUP 10 U< OVER 1 AND 0= AND IF >R 4/ 8400+ R@ + R> 1+ B LSH + MIROIR 2, EXIT THEN THEN ELSE DECODE_WN DUP 10 U< IF >R 4/ 4000+ R> + MIROIR 2, EXIT ELSE DROP ADRESSE_EFFECTIVE 0= IF DUP FF800001 AND 0= IF DUP >R FFFF AND + MIROIR 2, R> SWAB 7F AND MIROIR 2, EXIT THEN ELSE DROP FFFF+ MIROIR 2, 7F MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_RCALL ( code --> - ) 8 LSH OPERANDE? DECODE_WN DUP 10 U< IF PIC_ASM @ 24 AND IF 010200+ ELSE 012000+ THEN MIROIR 2, DROP EXIT ELSE DROP ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF 2/ MEM_HERE_ASM 2@ ORG_ASM 2@ + 4+ 4/ - DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN FFFF AND ELSE DROP FFFF THEN + MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_REPEAT ( code --> - ) 8 LSH OPERANDE? DECODE_WN DUP 10 U< IF + 8000+ MIROIR 2, EXIT ELSE DROP ADRESSE_EFFECTIVE 1 = IF DUP PIC_ASM @ 24 AND IF 8000 ELSE 4000 THEN U< IF + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_RETLW ( code --> - ) 8 LSH SP_TAILLE OPERANDE? DUP 2 U< IF ADRESSE_EFFECTIVE 1 = IF DUP 3 PICK IF 400 ELSE 100 THEN U< IF 4 LSH >R 0= 4000 AND + R> + SP_TST_, IF DECODE_WN DUP 10 U< IF + MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_POP ( code --> - ) SP_SUFFIXE DUP 7 = IF DROP D LSH FE8000+ MIROIR 2, EXIT ELSE OPERANDE? DUP 2 = IF DROP DECODE_WN DUP 10 U< OVER 1 AND 0= AND IF SWAP IF BE9F80+ ELSE 7 LSH BE004F+ THEN MIROIR 2, EXIT THEN ELSE 1 = IF ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 9 < AND IF 2- ROT IF 4 LSH 781F80+ >R DUP 7800 AND 4 LSH >R F AND ELSE B LSH 78004F+ >R DUP 7800 AND 4 LSH >R F AND 7 LSH THEN R> + R> + MIROIR 2, EXIT THEN ELSE DUP 10000 U< OVER 1 AND 0= AND IF SWAP IF F80000+ ELSE F90000+ THEN MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_EXCH ( code --> - ) 8 LSH OPERANDE? DECODE_WN DUP 10 U< IF 7 LSH + SP_TST_, IF DECODE_WN DUP 10 U< IF + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOV ( 0 --> - ) DROP SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF SP_TST_, IF DUP 1 = IF DROP OVER 2 U< IF SWAP IF DUP -8000 < OVER FFFF > OR NOT IF FFFF AND 4 LSH 200000+ ADRESSE_EFFECTIVE 2 = IF + MIROIR 2, EXIT THEN THEN ELSE DUP -80 < OVER FF > OR NOT IF FF AND 4 LSH B3C000+ ADRESSE_EFFECTIVE 2 = IF + MIROIR 2, EXIT THEN THEN THEN THEN ELSE DUP 2 = IF DROP ADRESSE_EFFECTIVE ?DUP IF 4 PICK 2 U< IF DUP 1 > OVER 9 < AND IF 2- 4 LSH + 7 LSH + 780000+ SWAP 0= 4000 AND + MIROIR 2, EXIT ELSE 9 = IF ROT IF DUP -4 ASH DUP -400 < OVER 3FE > OR SWAP 1 AND OR NOT IF DUP 2/ DUP 70 AND >R 4 ASH DUP 3800 AND >R 2* 78000 AND >R F AND 7 LSH R> + R> + R> + + 980000+ MIROIR 2, EXIT THEN ELSE DUP -4 ASH DUP -200 < SWAP 1FF > OR NOT IF DUP DUP 70 AND >R 4 ASH DUP 3800 AND >R 2* 78000 AND >R F AND 7 LSH R> + R> + R> + + 984000+ MIROIR 2, EXIT THEN THEN THEN THEN ELSE 4 ROLL 2 = 4 PICK 1 AND NOT AND 3 PICK 1 AND NOT AND OVER 2 = AND IF DROP 7 LSH + BE0000+ MIROIR 2, EXIT THEN THEN ELSE 3 PICK 2 U< OVER 10000 U< AND IF OVER 0= OVER 2000 U< AND IF + B7A000+ SWAP 0= 4000 AND + MIROIR 2, EXIT ELSE ROT 1 = OVER 1 AND 0= AND IF 3 LSH + 880000+ MIROIR 2, EXIT THEN THEN THEN THEN ELSE 3 PICK 2 U< IF DUP 9 < IF 2- ADRESSE_EFFECTIVE DUP 1 > OVER 9 < AND IF 2- 3 PICK 6 = OVER 6 = AND 5 PICK 7800 AND 3 PICK 7800 AND - AND NOT IF DUP B LSH >R 6 = IF DUP 7800 AND 4 LSH >R F AND 7 LSH R> + >R 4 LSH >R F AND ELSE 7 LSH >R DUP 4 LSH >R 6 = IF DUP 7800 AND 4 LSH >R F AND R> + THEN THEN R> + R> + R> + SWAP IF 780000+ ELSE 784000+ THEN MIROIR 2, EXIT THEN THEN ELSE 9 = IF ADRESSE_EFFECTIVE 2 = IF ROT IF OVER -4 ASH DUP -400 < OVER 3FE > OR SWAP 1 AND OR NOT IF >R DUP 2/ DUP 70 AND >R 4 ASH DUP 3800 AND >R 2* 78000 AND >R F AND R> + R> + R> + R> 7 LSH + 900000+ MIROIR 2, EXIT THEN ELSE OVER -4 ASH DUP -200 < SWAP 1FF > OR NOT IF >R DUP DUP 70 AND >R 4 ASH DUP 3800 AND >R 2* 78000 AND >R F AND R> + R> + R> + R> 7 LSH + 904000+ MIROIR 2, EXIT THEN THEN THEN THEN THEN ELSE ROT 2 = IF DUP 8 < IF 2- 4 LSH + ADRESSE_EFFECTIVE 2 = OVER 1 AND NOT AND IF 7 LSH + BE0000+ MIROIR 2, EXIT THEN THEN THEN THEN THEN THEN THEN ELSE OVER 2 U< IF SP_TST_, IF ADRESSE_EFFECTIVE 2 = IF OVER 2000 U< OVER 0= AND IF DROP BF8000+ SWAP 1 XOR E LSH + MIROIR 2, EXIT ELSE OVER 10000 U< 3 PICK 1 AND 0= AND 4 ROLL 1 = AND IF >R 3 LSH R> + 800000+ MIROIR 2, EXIT THEN THEN THEN ELSE DUP 2000 U< IF BFA000+ SWAP 1 XOR E LSH + MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : SP_MOVPAG ( - --> 0 DSRPAG, 1 DSWPAG, 2 TBLPAG, -1 sinon ) PAD 2@ >IN 2@ + DUP C@ DUP 44 = IF DROP DUP 1+ C@ 53 = IF DUP 2+ C@ DUP 52 = IF DROP DUP 3+ C@ 50 = OVER 4+ C@ 41 = AND SWAP 5+ C@ 47 = AND IF 6 >IN +2! 0 ELSE -1 THEN ELSE 57 = OVER 3+ C@ 50 = AND OVER 4+ C@ 41 = AND SWAP 5+ C@ 47 = AND IF 6 >IN +2! 1 ELSE -1 THEN THEN ELSE DROP -1 THEN ELSE 54 = OVER 1+ C@ 42 = AND OVER 2+ C@ 4C = AND OVER 3+ C@ 50 = AND OVER 4+ C@ 41 = AND SWAP 5+ C@ 47 = AND IF 6 >IN +2! 2 ELSE -1 THEN THEN ; : INST_MOVPAG ( 0 --> - ) PIC_ASM @ 24 AND IF DROP OPERANDE? ADRESSE_EFFECTIVE ?DUP IF SP_TST_, IF SP_MOVPAG DUP 3 U< IF SWAP DUP 1 = IF DROP OVER OVER ?DUP IF 1- IF 100 ELSE 200 THEN ELSE 400 THEN U< IF A LSH + FEC000+ MIROIR 2, EXIT THEN ELSE 2 = IF A LSH + FED000+ MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ELSE MAUVAISE_INSTRUCTION THEN ; : INST_SWAP ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE 2 = 3 PICK 2 U< AND IF SWAP 0= 4000 AND + + MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_TBLRDH ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? DUP 3 U< IF 0= 4000 AND + ADRESSE_EFFECTIVE DUP 2 > OVER 8 < AND SP_TST_, AND IF 2- 4 LSH + + ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + 7 LSH + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_TBLWTH ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? DUP 3 U< IF 0= 4000 AND + ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND SP_TST_, AND IF 2- 4 LSH + + ADRESSE_EFFECTIVE DUP 2 > OVER 8 < AND IF 2- 4 LSH + 7 LSH + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ADD ( code --> - ) SP_TAILLE OPERANDE? OVER 0= 3 PICK 2 = OR OVER 1 = AND PIC_ASM @ 38 AND AND IF PAD 2@ >IN 2@ + DUP >R C@ DUP 41 = OVER 42 = OR R> 1+ C@ 21 < AND IF 1 >IN +2! 41- F LSH >R DROP IF CD3000 ELSE CD0000 THEN R> + MIROIR 2, EXIT ELSE DROP THEN THEN ADRESSE_EFFECTIVE ?DUP IF SP_TST_, IF DUP 1 = IF DROP PASSE_ASM @ 0= IF DROP DUP IF 3FF ELSE FF THEN THEN OVER IF DUP -200 < OVER 3FF ELSE DUP -80 < OVER FF THEN > OR NOT >R DECODE_WN DUP 10 U< R> AND IF >R 4 LSH R> + SWAP 0= 4000 AND + SWAP CASE 0 OF B00000+ ENDOF 1 OF B08000+ ENDOF 2 OF B10000+ ENDOF 3 OF B18000+ ENDOF 4 OF B20000+ ENDOF 5 OF B30000+ ENDOF B28000+ ENDCASE MIROIR 2, EXIT THEN ELSE DUP 9 < IF 2- 4 PICK 0= 4 PICK 1 = AND PIC_ASM @ 38 AND AND IF PAD 2@ >IN 2@ + DUP >R C@ DUP 41 = OVER 42 = OR R> 1+ C@ 21 < AND IF 1 >IN +2! 41- F LSH >R 4 LSH + >R DROP DROP R> R> + C90000+ MIROIR 2, EXIT ELSE DROP THEN THEN ADRESSE_EFFECTIVE DUP 1 = IF DROP SP_TST_, IF 5 PICK 0= 5 PICK 1 = AND PIC_ASM @ 38 AND AND IF PAD 2@ >IN 2@ + DUP >R C@ DUP 41 = OVER 42 = OR R> 1+ C@ 21 < AND IF 1 >IN +2! 41- F LSH >R PASSE_ASM @ 0= IF DROP -1 THEN DUP -8 < OVER 7 > OR NOT IF F AND 7 LSH >R 4 LSH + >R DROP DROP R> R> + R> + C90000+ MIROIR 2, EXIT THEN ELSE DROP THEN THEN ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND 5 ROLL 0= AND IF 2- PASSE_ASM @ 0= IF >R >R DROP 1F R> R> THEN 3 PICK 20 U< IF 4 LSH + 7 LSH + >R F LSH SWAP 0= 4000 AND + R> + SWAP CASE 0 OF 400060+ ENDOF 1 OF 480060+ ENDOF 2 OF 500060+ ENDOF 3 OF 580060+ ENDOF 4 OF 600060+ ENDOF 5 OF 700060+ ENDOF 680060+ ENDCASE MIROIR 2, EXIT THEN THEN THEN ELSE DUP 1 > OVER 8 < AND SP_TST_, AND 4 ROLL 0= AND IF 2- ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + 3 LSH + 4 LSH + >R F LSH SWAP 0= 4000 AND + R> + SWAP CASE 0 OF 400000+ ENDOF 1 OF 480000+ ENDOF 2 OF 500000+ ENDOF 3 OF 580000+ ENDOF 4 OF 600000+ ENDOF 5 OF 700000+ ENDOF 680000+ ENDCASE MIROIR 2, EXIT THEN THEN THEN THEN THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN DUP 2000 U< IF SP_TST_, IF DECODE_WN 0= ELSE 2000+ -1 THEN IF SWAP 0= 4000 AND + SWAP CASE 0 OF B40000+ ENDOF 1 OF B48000+ ENDOF 2 OF B50000+ ENDOF 3 OF B58000+ ENDOF 4 OF B60000+ ENDOF 5 OF B70000+ ENDOF B68000+ ENDCASE MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_DAW ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE 2 = ROT 0= AND IF + MIROIR 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_DEC ( code --> - ) SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND SP_TST_, AND IF 2- ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + 3 LSH + 4 LSH + SWAP 0= 4000 AND + SWAP CASE 0 OF E90000+ ENDOF 1 OF E98000+ ENDOF 2 OF E80000+ ENDOF 3 OF E88000+ ENDOF 4 OF EA8000+ ENDOF EA0000+ ENDCASE MIROIR 2, EXIT THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN DUP 2000 U< IF SP_TST_, IF DECODE_WN 0= ELSE 2000+ -1 THEN IF SWAP 0= 4000 AND + SWAP CASE 0 OF ED0000+ ENDOF 1 OF ED8000+ ENDOF 2 OF EC0000+ ENDOF 3 OF EC8000+ ENDOF 4 OF EE8000+ ENDOF EE0000+ ENDCASE MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_NEG ( 0 --> - ) SP_SUFFIXE OPERANDE? DUP 1 = PIC_ASM @ 38 AND AND IF PAD 2@ >IN 2@ + DUP >R C@ 41- DUP 2 U< R> 1+ C@ 21 < AND IF 1 >IN +2! F LSH >R DROP DROP CD1000 R> + MIROIR 2, EXIT ELSE DROP THEN THEN ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND SP_TST_, AND IF 2- ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + 3 LSH + 4 LSH + SWAP 0= 4000 AND + EA0000+ MIROIR 2, DROP EXIT THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN DUP 2000 U< IF SP_TST_, IF DECODE_WN 0= ELSE 2000+ -1 THEN IF SWAP 0= 4000 AND + EE0000+ MIROIR 2, DROP EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_DIV ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? DUP 7 = OVER 8 = OR OVER B = OR OVER C = OR IF DECODE_WN DUP 10 U< SP_TST_, AND IF DECODE_WN DUP 10 U< OVER 1 > AND IF 3 PICK 8 = 4 PICK C = OR 3 PICK 1 AND AND NOT IF >R 7 LSH >R DUP 8 = OVER C = OR IF R> DUP 80+ 4 LSH + 40+ >R THEN 8 > 8000 AND + R> + R> + MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_DIVF ( code --> - ) 8 LSH OPERANDE? DECODE_WN DUP 10 U< SP_TST_, AND PIC_ASM @ 38 AND AND IF DECODE_WN DUP 10 U< OVER 1 > AND IF B LSH + + MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_MUL ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF 2 = 3 PICK 9 = 4 PICK A = OR 4 PICK D = OR 4 PICK E = OR AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 0> OVER 8 < AND SP_TST_, AND IF PAD 2@ >IN 2@ + DUP >R C@ DUP 41 = SWAP 42 = OR R> 1+ C@ 21 < AND PIC_ASM @ 20 AND AND IF PAD 2@ >IN 2@ + C@ 1 >IN +2! 41- OVER 1 = IF 4 PICK 20 U< 6 PICK A = 7 PICK E = OR AND IF 7 LSH >R DROP 60+ >R B LSH >R A = 10000 AND + R> + R> + R> + MIROIR 2, EXIT THEN ELSE E+ 7 LSH >R 2- 4 LSH + >R B LSH >R CASE 9 OF 18000+ ENDOF A OF 10000+ ENDOF D OF 8000+ ENDOF ENDCASE R> + R> + R> + MIROIR 2, EXIT THEN ELSE DECODE_WN DUP D U< OVER 1 AND 0= AND IF OVER 1 = IF 4 PICK 20 U< 6 PICK A = 7 PICK E = OR AND IF 7 LSH >R DROP 60+ >R B LSH >R A = 10000 AND + R> + R> + R> + MIROIR 2, EXIT THEN ELSE 7 LSH >R 2- 4 LSH + >R B LSH >R CASE 9 OF 18000+ ENDOF A OF 10000+ ENDOF D OF 8000+ ENDOF ENDCASE R> + R> + R> + MIROIR 2, EXIT THEN THEN THEN THEN THEN ELSE OVER 2 U< IF PASSE_ASM @ 0= IF DROP 1FFF THEN DUP 2000 U< IF >R 0= 4000 AND + 40000+ R> + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MULW ( code --> - ) ( bizarre car peu different de MUL ) PIC_ASM @ 24 AND IF 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE 2 = 3 PICK 9 = 4 PICK A = OR 4 PICK D = OR 4 PICK E = OR AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 0> OVER 8 < AND SP_TST_, AND IF DECODE_WN DUP D U< OVER 1 AND 0= AND IF OVER 1 = IF 4 PICK 20 U< 6 PICK A = 7 PICK E = OR AND IF 7 LSH >R DROP 60+ >R B LSH >R A = 10000 AND + R> + R> + R> + MIROIR 2, EXIT THEN ELSE 7 LSH >R 2- 4 LSH + >R B LSH >R CASE 9 OF 18000+ ENDOF A OF 10000+ ENDOF D OF 8000+ ENDOF ENDCASE R> + R> + R> + MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE THEN MAUVAISE_INSTRUCTION ; : INST_SE ( code --> - ) 8 LSH OPERANDE? ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND SP_TST_, AND IF 2- DECODE_WN DUP 10 U< IF 7 LSH >R 4 LSH + + R> + MIROIR 2, EXIT THEN THEN MAUVAISE_INSTRUCTION ; : INST_SUBBR ( code --> - ) SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF 2 = 3 PICK 2 U< AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 0> OVER 8 < AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 3 PICK 1 = IF 4 PICK 20 U< IF 2- 4 LSH + 7 LSH >R DROP 60+ >R F LSH >R 0= 4000 AND SWAP IF 100000+ ELSE 180000+ THEN R> + R> + R> + MIROIR 2, EXIT THEN ELSE 2- 4 LSH + 7 LSH >R 2- 4 LSH + >R F LSH >R 0= 4000 AND SWAP IF 100000+ ELSE 180000+ THEN R> + R> + R> + MIROIR 2, EXIT THEN THEN THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN OVER 2 U< OVER 2000 U< AND IF SP_TST_, IF DECODE_WN 0= IF 0 ELSE -1 THEN ELSE 2000 THEN DUP 0< NOT IF + >R 0= 4000 AND R> + SWAP IF BD0000+ ELSE BD8000+ THEN MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; ( PAD 2@ >IN 2@ + DUP >R C@ DUP 41 = OVER 42 = OR R> 1+ C@ 21 < AND IF 1 >IN +2! 41- F LSH >R DROP IF CD3000 ELSE CD0000 THEN R> + MIROIR 2, EXIT ELSE DROP THEN ) : INST_CLR ( code --> - ) SP_SUFFIXE OPERANDE? OVER 0= OVER 1 = OR PIC_ASM @ 38 AND AND IF PAD 2@ >IN 2@ + C@ DUP 41 = OVER 42 = OR IF 41- F LSH 1 >IN +2! SP_TST_, IF C30000+ ADRESSE_EFFECTIVE_DSP DUP 4 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP 4* + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = IF + ELSE MAUVAISE_OPERANDE THEN ELSE 2+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 10+ R> R> 6 = IF + ELSE MAUVAISE_OPERANDE THEN THEN ELSE 12+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 100+ R> R> DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = IF + ELSE MAUVAISE_OPERANDE THEN ELSE 2+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 10+ R> R> 6 = IF + ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE C30112+ THEN MIROIR 2, DROP DROP EXIT ELSE DROP THEN THEN ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND 4 PICK 2 U< AND IF 2- OVER OVER OR IF 4 LSH + 7 LSH ROT IF EB8000+ ELSE EB0000+ THEN ELSE DROP DROP SWAP IF EF8000 ELSE EF0000 THEN THEN SWAP 0= 4000 AND + MIROIR 2, EXIT THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN OVER 2 U< OVER 2000 U< AND IF 2000 OR SWAP 0= 4000 AND + SWAP IF EF8000+ ELSE EF0000+ THEN MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_ASR ( code --> - ) SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND SP_TST_, AND IF ADRESSE_EFFECTIVE SP_TST_, IF DECODE_WN DUP 10 U< 5 ROLL 2 = AND 6 ROLL 1 = AND IF OVER 1 = 4 PICK 10 U< AND 3 PICK 2 = OR IF 7 LSH >R 1 = 40 AND + >R B LSH R> + R> + SWAP ?DUP IF 1- IF DD0000+ ELSE DE0000+ THEN ELSE DE8000+ THEN MIROIR 2, EXIT THEN THEN ELSE 5 PICK 2 U< OVER 1 > 3 PICK 8 < AND AND IF 2- 4 LSH + 7 LSH >R 2- 4 LSH + >R 0= 4000 AND R> + R> + SWAP ?DUP IF 1- IF D00000+ ELSE D10000+ THEN ELSE D18000+ THEN MIROIR 2, EXIT THEN THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN DUP 2000 U< 3 PICK 2 U< AND IF SP_TST_, IF DECODE_WN 0= IF SWAP 0= 4000 AND + SWAP ?DUP IF 1- IF D40000+ ELSE D50000+ THEN ELSE D58000+ THEN MIROIR 2, EXIT THEN ELSE 2000+ SWAP 0= 4000 AND + SWAP ?DUP IF 1- IF D40000+ ELSE D50000+ THEN ELSE D58000+ THEN MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_RLC ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND SP_TST_, AND 4 PICK 2 U< AND IF ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + >R 2- 4 LSH + 7 LSH >R 0= 4000 AND + 40000- R> + R> + MIROIR 2, EXIT THEN THEN ELSE PASSE_ASM @ 0= IF DROP 1FFF THEN OVER 2 U< OVER 2000 U< AND IF >R 0= 4000 AND + R> + + SP_TST_, IF DECODE_WN 10 U< IF MIROIR 2, EXIT THEN ELSE 2000+ MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BCLR ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND 4 ROLL 1 = AND SP_TST_, AND IF ADRESSE_EFFECTIVE 1 = OVER 10 U< AND IF C LSH >R 2- 4 LSH + >R 80000- R> + R> + MIROIR 2, EXIT THEN THEN ELSE PASSE_ASM @ 0= IF DROP DUP 0= IF 1FFF ELSE 1FFE THEN THEN OVER 2 U< OVER 2000 U< AND SP_TST_, AND IF ADRESSE_EFFECTIVE 1 = OVER 5 ROLL 0= IF 8 ELSE 10 THEN U< AND IF DUP 7 AND >R -3 LSH 1 AND + R> D LSH + + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BSW ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 3 PICK 3 = 4 PICK 4 = OR SP_TST_, AND IF DECODE_WN DUP 10 U< IF B LSH >R 2- 4 LSH + >R 4 = 8000 AND + R> + R> + MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BTST ( 0 --> - ) DROP SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND 4 PICK 3 = 5 PICK 4 = OR AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 0> OVER 8 < AND IF DUP 1 = OVER 10 U< AND IF DROP C LSH >R 2- 4 LSH + >R 4 = 800 AND A30000+ R> + R> + MIROIR 2, EXIT ELSE 2 = IF B LSH >R 2- 4 LSH + >R 4 = 8000 AND A50000+ R> + R> + MIROIR 2, EXIT THEN THEN THEN THEN ELSE PASSE_ASM @ 0= IF DROP DUP 0= IF 1FFF ELSE 1FFE THEN THEN OVER 2 U< OVER 2000 U< AND SP_TST_, AND IF ADRESSE_EFFECTIVE 1 = OVER 5 ROLL 0= IF 8 ELSE 10 THEN U< AND IF DUP E AND >R 1 AND + R> C LSH + AB0000+ MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BTSTS ( 0 --> - ) DROP SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND 4 PICK 3 = 5 PICK 4 = OR AND SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 1 = OVER 10 U< AND IF DROP C LSH >R 2- 4 LSH + >R 4 = 800 AND A40000+ R> + R> + MIROIR 2, EXIT THEN THEN ELSE PASSE_ASM @ 0= IF DROP DUP IF 1FFE ELSE 1FFF THEN THEN OVER 2 U< OVER 2000 U< AND SP_TST_, AND IF ADRESSE_EFFECTIVE 1 = OVER 5 ROLL 0= IF 8 ELSE 10 THEN U< AND IF DUP E AND >R 1 AND + R> C LSH + AC0000+ MIROIR 2, EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_CP ( code --> - ) SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF 2 = SP_TST_, AND IF ADRESSE_EFFECTIVE DUP 1 > OVER 8 < AND IF 2- 4 LSH + >R B LSH R> + SWAP 0= 400 AND + SWAP IF E18000+ ELSE E10000+ THEN MIROIR 2, EXIT ELSE 1 = IF PASSE_ASM @ 0= IF DROP PIC_ASM @ 28 AND IF FF ELSE 1F THEN THEN 3 PICK 2 U< OVER PIC_ASM @ 28 AND IF 100 ELSE 20 THEN U< AND IF DUP 1F AND >R E0 AND 4* 60+ >R B LSH R> + R> + SWAP 0= 400 AND + SWAP IF E18000+ ELSE E10000+ THEN MIROIR 2, EXIT THEN THEN THEN THEN ELSE PASSE_ASM @ 0= IF DROP DUP IF 1FFE ELSE 1FFF THEN THEN OVER 2 U< OVER 2000 U< AND IF SWAP 0= 4000 AND + SWAP IF E38000+ ELSE E30000+ THEN MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_CP0 ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? ADRESSE_EFFECTIVE ?DUP IF DUP 1 > OVER 8 < AND IF 2- 4 LSH + SWAP 0= 400 AND + + MIROIR 2, EXIT THEN ELSE PASSE_ASM @ 0= IF DROP DUP IF 1FFE ELSE 1FFF THEN THEN OVER 2 U< OVER 2000 U< AND IF SWAP 0= 4000 AND + + 20000+ MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_CPBEQ ( code --> - ) 8 LSH SP_SUFFIXE DUP 2 U< >R OPERANDE? PIC_ASM @ 24 AND R> AND IF 0= 400 AND + DECODE_WN DUP 10 U< IF B LSH + SP_TST_, IF DECODE_WN DUP 10 U< IF + SP_TST_, IF ADRESSE_EFFECTIVE 0= IF PASSE_ASM @ IF 2/ MEM_HERE_ASM 2@ ORG_ASM 2@ + 4+ 4/ - DUP -20 < OVER 1F > OR IF MAUVAIS_BRANCHEMENT THEN 3F AND 4 LSH ELSE DROP 3F0 THEN + MIROIR 2, EXIT THEN THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_CPSEQ ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? DUP 2 U< IF 0= 400 AND + DECODE_WN DUP 10 U< IF B LSH + SP_TST_, IF DECODE_WN DUP 10 U< IF + PIC_ASM @ 24 AND IF 10+ THEN MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_LAC ( code --> - ) 8 LSH OPERANDE? PIC_ASM @ 38 AND IF ADRESSE_EFFECTIVE DUP 1 > OVER 9 < AND IF 2- 4 LSH + + SP_TST_, IF SP_TST_# IF DECODE_NOMBRE PASSE_ASM @ IF DUP -8 < OVER 7 > OR IF MAUVAISE_OPERANDE ELSE F AND 7 LSH + THEN ELSE DROP 780+ THEN SP_TST_, 0= IF MAUVAISE_OPERANDE THEN THEN ADRESSE_EFFECTIVE_DSP 2 = IF + MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_SAC ( code --> - ) 8 LSH SP_SUFFIXE OPERANDE? DUP 1 = OVER 6 = OR PIC_ASM @ 38 AND AND IF 6 = 10000 AND + ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF SP_TST_# IF DECODE_NOMBRE PASSE_ASM @ IF DUP -8 < OVER 7 > OR IF MAUVAISE_OPERANDE ELSE F AND 7 LSH + THEN ELSE DROP 780+ THEN SP_TST_, 0= IF MAUVAISE_OPERANDE THEN THEN ADRESSE_EFFECTIVE DUP 1 > OVER 9 < AND IF 2- 4 LSH + + MIROIR 2, EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_SFTAC ( code --> - ) 8 LSH OPERANDE? PIC_ASM @ 38 AND IF ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF ADRESSE_EFFECTIVE DUP 1 = IF DROP PASSE_ASM @ IF DUP -10 < OVER 10 > OR IF MAUVAISE_OPERANDE ELSE 1F AND 20+ + THEN ELSE DROP 7F+ THEN MIROIR 2, EXIT ELSE 2 = IF + MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOVSAC ( code --> - ) 8 LSH OPERANDE? PIC_ASM @ 38 AND IF ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 4 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP 4* + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = IF + ELSE MAUVAISE_OPERANDE THEN ELSE 2+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 10+ R> R> 6 = IF + ELSE MAUVAISE_OPERANDE THEN THEN ELSE 12+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 100+ R> R> DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 3 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = IF + ELSE MAUVAISE_OPERANDE THEN ELSE 2+ THEN ELSE MAUVAISE_OPERANDE THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 10+ R> R> 6 = IF + ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE 112+ THEN MIROIR 2, EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_ED ( code --> - ) F00000+ OPERANDE? PIC_ASM @ 38 AND IF ADRESSE_EFFECTIVE_DSP 0= IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 4 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 5 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF 4* + MIROIR 2, EXIT THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MAC ( code --> - ) SP_SUFFIXE OPERANDE? DUP 1 = OVER 5 = OR PIC_ASM @ 38 AND AND IF ADRESSE_EFFECTIVE_DSP ?DUP IF 1 = IF OVER 1 = IF SWAP DROP SWAP ?DUP IF 1- IF C04000+ ( MSC ) ELSE C00003+ ( MPY ) THEN ELSE C00000+ ( MAC ) THEN ELSE SWAP 5 = ROT 1 = AND IF C04003+ ( MPY.N ) ELSE MAUVAISE_INSTRUCTION THEN THEN SP_TST_, IF ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 4 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF 4* + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = 3 PICK 3 AND 0= AND IF + MIROIR EXIT THEN ELSE DUP 2 AND 2 XOR + MIROIR 2, EXIT THEN THEN THEN ELSE 6 = 3 PICK 3 AND 0= AND IF + 10+ MIROIR 2, EXIT THEN THEN ELSE 10+ DUP 2 AND 2 XOR + MIROIR 2, EXIT THEN THEN THEN ELSE >R >R 100+ R> R> DUP 5 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 6 = 3 PICK 3 AND 0= AND IF + MIROIR 2, EXIT THEN ELSE 2+ MIROIR 2, EXIT THEN THEN THEN ELSE 6 = 3 PICK 3 AND 0= AND IF + 10+ MIROIR 2, EXIT THEN THEN THEN ELSE 110+ DUP 2 AND 2 XOR + MIROIR 2, EXIT THEN THEN THEN THEN ELSE SWAP 1 = 3 PICK 2 < AND SP_TST_, AND IF SWAP IF F00001+ ( MPY ) ELSE F00000+ ( MAC ) THEN ADRESSE_EFFECTIVE_DSP 2 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP DUP 4 = IF DROP + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF 4* + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 5 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF + MIROIR 2, EXIT THEN THEN THEN ELSE MIROIR 2, EXIT THEN THEN THEN ELSE >R >R 100+ R> R> 5 = IF + SP_TST_, IF ADRESSE_EFFECTIVE_DSP 3 = IF + MIROIR 2, EXIT THEN THEN THEN THEN ELSE MIROIR 2, EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; ( Instructions ) " CLRWDT" FE60 FIND INST_CLRWDT INS_ASM " NOP" 0000 FIND INST_CLRWDT INS_ASM " NOPR" FF00 FIND INST_CLRWDT INS_ASM " RESET" FE00 FIND INST_CLRWDT INS_ASM " RETFIE" 0640 FIND INST_CLRWDT INS_ASM " RETURN" 0600 FIND INST_CLRWDT INS_ASM " ULNK" FA80 FIND INST_CLRWDT INS_ASM " LNK" FA00 FIND INST_LNK INS_ASM " DISI" FC00 FIND INST_DISI INS_ASM " PWRSAV" FE40 FIND INST_PWRSAV INS_ASM " BRA" 0000 FIND INST_BRA INS_ASM " CALL" 0200 FIND INST_CALL INS_ASM " DO" 0800 FIND INST_DO INS_ASM " GOTO" 0400 FIND INST_GOTO INS_ASM " RCALL" 0700 FIND INST_RCALL INS_ASM " REPEAT" 0900 FIND INST_REPEAT INS_ASM " RETLW" 0500 FIND INST_RETLW INS_ASM " POP" 0000 FIND INST_POP INS_ASM " PUSH" 0001 FIND INST_POP INS_ASM " EXCH" FD00 FIND INST_EXCH INS_ASM " MOV" 0000 FIND INST_MOV INS_ASM " MOVPAG" 0000 FIND INST_MOVPAG INS_ASM " SWAP" FD80 FIND INST_SWAP INS_ASM " TBLRDH" BA80 FIND INST_TBLRDH INS_ASM " TBLRDL" BA00 FIND INST_TBLRDH INS_ASM " TBLWTH" BB80 FIND INST_TBLWTH INS_ASM " TBLWTL" BB00 FIND INST_TBLWTH INS_ASM " ADD" 0000 FIND INST_ADD INS_ASM " ADDC" 0001 FIND INST_ADD INS_ASM " SUB" 0002 FIND INST_ADD INS_ASM " SUBB" 0003 FIND INST_ADD INS_ASM " AND" 0004 FIND INST_ADD INS_ASM " IOR" 0005 FIND INST_ADD INS_ASM " XOR" 0006 FIND INST_ADD INS_ASM " DAW" FD40 FIND INST_DAW INS_ASM " DEC" 0000 FIND INST_DEC INS_ASM " DEC2" 0001 FIND INST_DEC INS_ASM " INC" 0002 FIND INST_DEC INS_ASM " INC2" 0003 FIND INST_DEC INS_ASM " COM" 0004 FIND INST_DEC INS_ASM " NEG" 0005 FIND INST_NEG INS_ASM " DIV" D800 FIND INST_DIV INS_ASM " DIVF" D900 FIND INST_DIVF INS_ASM " MUL" B800 FIND INST_MUL INS_ASM " MULW" B800 FIND INST_MULW INS_ASM " SE" FB00 FIND INST_SE INS_ASM " ZE" FD80 FIND INST_SE INS_ASM " FBCL" DF00 FIND INST_SE INS_ASM " FF1L" CF80 FIND INST_SE INS_ASM " FF1R" CF00 FIND INST_SE INS_ASM " SUBBR" 0000 FIND INST_SUBBR INS_ASM " SUBR" 0001 FIND INST_SUBBR INS_ASM " CLR" 0000 FIND INST_CLR INS_ASM " SETM" 0001 FIND INST_CLR INS_ASM " ASR" 0000 FIND INST_ASR INS_ASM " LSR" 0001 FIND INST_ASR INS_ASM " SL" 0002 FIND INST_ASR INS_ASM " RLC" D680 FIND INST_RLC INS_ASM " RLNC" D600 FIND INST_RLC INS_ASM " RRC" D780 FIND INST_RLC INS_ASM " RRNC" D700 FIND INST_RLC INS_ASM " BCLR" A900 FIND INST_BCLR INS_ASM " BSET" A800 FIND INST_BCLR INS_ASM " BTG" AA00 FIND INST_BCLR INS_ASM " BTSC" AF00 FIND INST_BCLR INS_ASM " BTSS" AE00 FIND INST_BCLR INS_ASM " BSW" AD00 FIND INST_BSW INS_ASM " BTST" 0000 FIND INST_BTST INS_ASM " BTSTS" 0000 FIND INST_BTSTS INS_ASM " CP" 0000 FIND INST_CP INS_ASM " CPB" 0001 FIND INST_CP INS_ASM " CP0" E000 FIND INST_CP0 INS_ASM " CPBEQ" E780 FIND INST_CPBEQ INS_ASM " CPBGT" E600 FIND INST_CPBEQ INS_ASM " CPBLT" E680 FIND INST_CPBEQ INS_ASM " CPBNE" E700 FIND INST_CPBEQ INS_ASM " CPSEQ" E780 FIND INST_CPSEQ INS_ASM " CPSGT" E600 FIND INST_CPSEQ INS_ASM " CPSLT" E680 FIND INST_CPSEQ INS_ASM " CPSNE" E700 FIND INST_CPSEQ INS_ASM " LAC" CA00 FIND INST_LAC INS_ASM " SAC" CC00 FIND INST_SAC INS_ASM " SFTAC" C800 FIND INST_SFTAC INS_ASM " MOVSAC" C700 FIND INST_MOVSAC INS_ASM " ED" 4003 FIND INST_ED INS_ASM " EDAC" 4002 FIND INST_ED INS_ASM " MAC" 0000 FIND INST_MAC INS_ASM " MPY" 0001 FIND INST_MAC INS_ASM " MSC" 0002 FIND INST_MAC INS_ASM ( Directives ) " DC" 0000 FIND INST_DC INS_ASM " END" 0000 FIND INST_END INS_ASM " EQU" 0000 FIND INST_EQU INS_ASM " ORG" 0000 FIND INST_ORG INS_ASM " PIC24F" 0001 FIND INST_PIC INS_ASM " PIC24H" 0002 FIND INST_PIC INS_ASM " PIC24E" 0004 FIND INST_PIC INS_ASM " DSPIC30F" 0008 FIND INST_PIC INS_ASM " DSPIC33F" 0010 FIND INST_PIC INS_ASM " DSPIC33E" 0020 FIND INST_PIC INS_ASM " RM" 0000 FIND INST_RM INS_ASM DECIMAL DEBUT_ASM DUP 2@ - 4+ START 2! : RAZ_ASSEMBLEUR -1 INIT_ASM ! ETIQUETTES_ASM DUP 8192+ POINTEUR_ASM 2! 8192 0 FILL 0 ORG_ASM 2! ; : ASSEMBLEUR INIT_ASM @ 0= IF RAZ_ASSEMBLEUR THEN PAD 2@ PAD_ASM 2! >IN 2@ 1- DUP >IN 2! >IN_ASM 2! 0 DUP PASSE_ASM ! INDEX_ASM ! 1 PIC_ASM ! HERE DUP HERE_ASM 2! MEM_HERE_ASM 2! BEGIN PAD 2@ >IN 2@ + DUP C@ 3 = IF DROP 0 INST_END ELSE 1 >IN +2! 1+ C@ DUP 59 = ( ; ) IF DROP ELSE DUP 64 > SWAP 91 < AND ( de A a Z ) IF 0 INDEX_ASM ! AF_CODE_ASM TAMPON_ASM INSERE_ETIQUETTE THEN PAD 2@ >IN 2@ + C@ DUP 0< OVER 32 = OR OVER 9 = OR IF 1 >IN +2! DUP 32 = SWAP 9 = OR IF PAD 2@ >IN 2@ BEGIN OVER OVER + C@ DUP 32 = SWAP 9 = OR IF 1+ 0 ELSE -1 THEN UNTIL >IN 2! DROP THEN TAMPON_ASM TMP_ASM TABLE_ASM DICO_CHERCHE IF AF_LIGNE_ASM ." **** Instruction assembleur inconnue !" ABORT ELSE 2@ DUP C@ 1+ DUP 1 AND + + DUP 2@ SWAP 4+ @ 65535 AND DEPTH SWAP ROT EXECUTE DEPTH 1+ - IF AF_LIGNE_ASM ." **** Probleme de pile !" ABORT THEN PAD 2@ >IN 2@ + C@ 32 > IF AF_LIGNE_ASM ." **** Syntaxe incorrecte !" ABORT THEN THEN ELSE DUP 59 = SWAP 32 U< OR NOT IF AF_LIGNE_ASM ." **** Ligne incorrecte !" ABORT THEN THEN THEN THEN PASSE_ASM @ DUP IF AF_LIGNE_ASM THEN AF_CODE_ASM 2 < IF PAD 2@ >IN 2@ + BEGIN DUP C@ DUP 32 U< NOT SWAP 9 = OR WHILE 1+ 1 >IN +2! REPEAT DROP 0 ELSE -1 THEN UNTIL ; : FORGET_ASSEMBLEUR START 2@ DEBUT_ASM U< IF ANCIEN_HERE DUP >R DEBUT_ASM DUP 2@ - - R> 2! ELSE DEBUT_ASM DUP 2@ - 4+ START 2! THEN DICO_INIT DEBUT_ASM MEMOIRE_LIBERE DROP ; " ASSEMBLEUR" STRING S_ASSEMBLEUR " <]" STRING S_<] 0 VARIABLE NB_CAR_INST : [>" RAZ_ASSEMBLEUR 34 WORD COUNT CHEMIN_CONCATENE ?DUP IF DUP >R 0 FOPEN R> MEMOIRE_LIBERE DROP 0< IF FCLOSE DROP ." Erreur -5" CR BELL ELSE ." Debut de generation du fichier FORTH. " 32 WORD DROP BEGIN 32 WORD COUNT OVER OVER S_ASSEMBLEUR COUNT STRCMP IF OVER OVER S_<] COUNT STRCMP IF NB_CAR_INST @ 0< IF DUP NB_CAR_INST ! ELSE OVER C@ 58 = OVER 1 = AND ( Detection instruction : ) IF -1 NB_CAR_INST ! THEN THEN >R DUP R> 4 PICK FWRITE DROP EOLN @ EOF @ OR IF 1- [ 13 8 LSH 10+ LITERAL ] OVER ! 2 ELSE 32 OVER C! 1 THEN 3 PICK FWRITE DROP ELSE DROP DROP THEN EOF @ ELSE BASE @ >R HEX HERE 2 AND IF 1 ALLOT THEN NB_CAR_INST @ ?DUP IF DUP 0> IF 1+ 3 /MOD SWAP 0= NOT - 1+ 2* ALLOT ELSE DROP THEN THEN DROP 1- [ 13 8 LSH 10+ LITERAL ] OVER ! 2 3 PICK FWRITE DROP HERE ASSEMBLEUR HERE OVER OVER - IF SWAP DO I 3+ C@ 8 LSH I 2+ C@ 255 AND + 8 LSH I 1+ C@ 255 AND + 8 LSH I C@ 255 AND + 0 <# DROP SWAP 44 HOLD 71 HOLD 82 HOLD 80 HOLD 32 HOLD # # # # 32 HOLD # # 32 HOLD #> OVER OVER 5 PICK FWRITE DROP DROP 1- [ 13 8 LSH 10+ LITERAL ] OVER ! 2 3 PICK FWRITE DROP 4 +LOOP ELSE DROP DROP THEN R> BASE ! NB_CAR_INST @ ?DUP IF 0> IF 2 ALLOT THEN 0 NB_CAR_INST ! THEN 0 THEN UNTIL ." Le fichier FORTH est complet. " FCLOSE IF ." Erreur -12" CR BELL THEN THEN ELSE ." Erreur -1" CR BELL THEN ; 0 INIT_ASM ! ANCIEN_HERE >HERE DICO_INIT ( FIN )