( Assembleur 68000. Version 1.50 du 18 Septembre 2011. Ecrit par jpb.forth . ) TELECHARGEMENT ( Assembleur 68000 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. La liste des modes d'adressage possibles est la suivante : Dn An (An) (An)+ -(An) (d16,An) (d8,An,Xn) (d16,PC) (d8,PC,Xn) Absolu16 Absolu32 Immediat Dn est un registre de donnee avec n compris entre 0 et 7 An (ou SP) est un registre d'adresse avec n compris entre 0 et 7 d16 indique un deplacement sur 16 bits d8 indique un deplacement sur 8 bits Xn est un registre de donnee ou d'adresse optionnel et qui peut avoir les suffixes .L pour prendre en compte ses 32 bits PC indique un adressage relatif au compteur de programme Pour toute information complementaire, consulter la documentation MOTOROLA. 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 : GENERE_DEBUT_ASM ( - --> adr ) [ FIND MEMOIRE_ALLOUE LITERAL ] ?DUP IF 10000 SWAP EXECUTE ELSE F8000 THEN ; GENERE_DEBUT_ASM FORGET GENERE_DEBUT_ASM DUP >HERE CONSTANT DEBUT_ASM CONSTANT ANCIEN_HERE DEBUT_ASM 7FFF+ -8000 AND 6000+ 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 MEM_HERE_ASM 0 VARIABLE MEM_OD_ASM 0 VARIABLE POINTEUR_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 a0 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 , ) 2C SP_TST_CAR ; : SP_TST_: ( - --> b a 0 si pas de : ) 3A SP_TST_CAR ; : SP_TST_( ( - --> b a 0 si pas de ( ) 28 SP_TST_CAR ; : SP_TST_) ( - --> b a 0 si pas de ) 29 SP_TST_CAR ; : SP_TST_/ ( - --> b a 0 si pas de / ) 2F SP_TST_CAR ; : SP_TST_{ ( - --> b a 0 si pas de { ) 7B SP_TST_CAR ; : SP_TST_} ( - --> b a 0 si pas de } ) 7D SP_TST_CAR ; : AF_MAUVAISE_LIGNE PAD 2@ >IN 2@ + BEGIN DUP 1- DUP PAD 2@ U< IF DROP -1 ELSE DUP C@ FF AND 1F > IF >R DROP R> 0 ELSE DROP -1 THEN THEN UNTIL 0 BEGIN OVER OVER + C@ FF AND 1F > WHILE 1+ REPEAT TYPE CR ; : 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_MAUVAISE_LIGNE ." **** Syntaxe incorrecte !" ABORT THEN ; : OPERANDE? PAD 2@ >IN 2@ + C@ DUP 0< OVER 20 = OR IF 1 >IN +2! 20 = IF PAD 2@ >IN 2@ BEGIN OVER OVER + C@ 20 = IF 1+ 0 ELSE -1 THEN UNTIL >IN 2! DROP THEN ELSE DROP AF_MAUVAISE_LIGNE ." **** Oubli d'une operande !" ABORT THEN ; : MAUVAISE_OPERANDE AF_MAUVAISE_LIGNE ." **** Operande incorrecte !" ABORT ; : MAUVAIS_BRANCHEMENT AF_MAUVAISE_LIGNE ." **** Branchement trop long !" ABORT ; : MAUVAIS_DECALAGE AF_MAUVAISE_LIGNE ." **** Decalage 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- HERE 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_MAUVAISE_LIGNE ." **** Impossible d'ajouter une etiquette !" ABORT THEN ELSE AF_MAUVAISE_LIGNE ." **** 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@ 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_MAUVAISE_LIGNE ." **** 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_MAUVAISE_LIGNE ." **** 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 ; : ADRESSE_EFFECTIVE ( - --> operande,extension,registre,mode ) PAD 2@ >IN 2@ + DUP C@ DUP 44 = OVER 41 = OR SWAP 53 = OR ( Dn,An ou SP ) IF DUP C@ 44 = IF DUP 1+ C@ DUP 2F > SWAP 38 < AND ( Dn ) IF 0 0 ROT 1+ C@ 7 AND 2 >IN +2! 0 ELSE -1 THEN ELSE DUP C@ 41 = OVER 1+ C@ DUP 2F > SWAP 38 < AND AND ( An ou SP ) OVER C@ 53 = 3 PICK 1+ C@ 50 = AND OR IF 0 0 ROT 1+ C@ DUP 50 = IF DROP 7 ELSE 7 AND THEN 2 >IN +2! 1 ELSE -1 THEN THEN DUP 0< IF DROP ELSE PAD 2@ >IN 2@ + DUP C@ 2E = ( . pour .W ou .L ) IF 1+ DUP C@ 57 = NOT ( .W ) IF DUP C@ 4C = ( .L ) IF >R 800+ R> ELSE MAUVAISE_OPERANDE THEN THEN 1+ 2 >IN +2! THEN DROP EXIT THEN THEN DUP C@ 50 = OVER 1+ C@ 43 = AND ( PC ) IF DROP 2 >IN +2! 0 0 7 7 EXIT THEN DUP C@ 23 = ( # ) IF DROP 1 >IN +2! ADRESSE_EFFECTIVE OVER 2 < OVER 7 = AND IF DROP DROP 4 7 EXIT ELSE MAUVAISE_OPERANDE THEN THEN DUP C@ 2D = OVER 1+ C@ 28 = AND ( -( ) IF DROP 2 >IN +2! ADRESSE_EFFECTIVE 1 = PAD 2@ >IN 2@ + C@ 29 = AND ( ) IF 1 >IN +2! 4 EXIT ELSE MAUVAISE_OPERANDE THEN THEN C@ 28 = ( ( ) IF 1 >IN +2! ADRESSE_EFFECTIVE DUP 1 = PAD 2@ >IN 2@ + C@ 29 = ( ) AND IF 1+ PAD 2@ >IN 2@ + 1+ C@ 2B = ( + ) IF 1+ 2 ELSE 1 THEN >IN +2! EXIT ELSE OVER 2 < OVER 7 = AND IF DROP DROP PAD 2@ >IN 2@ + C@ 2C = ( , ) IF 1 >IN +2! ADRESSE_EFFECTIVE ELSE MAUVAISE_OPERANDE THEN ELSE >R >R >R >R 0 110 R> R> R> R> THEN 5 PICK 130 < OVER 1 = AND PAD 2@ >IN 2@ + C@ 29 = ( ) AND IF 1 >IN +2! DROP >R DROP DROP DROP 0 R> 5 4 PICK -8000 < 5 PICK 7FFF > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN EXIT THEN DUP 1 = IF DROP >R DROP DROP R> 6 PAD 2@ >IN 2@ + C@ 2C = ( , ) IF 1 >IN +2! ADRESSE_EFFECTIVE DUP 7 AND 2 < IF DUP 1 AND 3 LSH ROT + C LSH SWAP E00 AND + >R DROP DROP ROT R> + ROT ROT 3 PICK 30 AND 30 < IF 3 PICK 30 AND IF 4 PICK -8000 < 5 PICK 7FFF > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN ELSE 4 PICK -80 < 5 PICK 7F > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN >R >R OVER FF AND + R> R> THEN THEN ELSE MAUVAISE_OPERANDE THEN ELSE >R >R 140 OR R> R> 3 PICK 30 AND 30 < IF 3 PICK 30 AND 0= IF >R >R 20+ R> R> THEN 3 PICK 30 AND 20 = IF 4 PICK -8000 < 5 PICK 7FFF > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN THEN THEN THEN ELSE DUP 7 AND 2 < IF DUP 1 AND 3 LSH ROT + C LSH SWAP E00 AND + >R DROP DROP 180 OR R> + DUP 30 AND 30 < IF DUP 30 AND 0= IF 20+ THEN DUP 30 AND 20 = IF 4 PICK -8000 < 5 PICK 7FFF > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN THEN THEN 0 6 ELSE 7 = SWAP 7 = AND IF DROP DROP PAD 2@ >IN 2@ + C@ 2C = ( , ) IF 1 >IN +2! ADRESSE_EFFECTIVE DUP 7 AND 2 < IF DUP 1 AND 3 LSH ROT + C LSH SWAP E00 AND + >R DROP DROP R> + DUP 130 AND 110 = IF 10+ THEN 3 7 ELSE MAUVAISE_OPERANDE THEN ELSE DUP 130 < IF 2 ELSE 40 OR 3 THEN 7 THEN ELSE MAUVAISE_OPERANDE THEN THEN THEN PAD 2@ >IN 2@ + C@ 29 = ( ) IF 1 >IN +2! EXIT THEN THEN ELSE 0 ETQ_ASM ! DECODE_NOMBRE PAD 2@ >IN 2@ + DUP C@ 2E = ( . ) IF 1+ C@ DUP 57 = ( W ) IF DROP 120 0 ELSE 4C = ( L ) IF 130 1 ELSE MAUVAISE_OPERANDE THEN THEN 2 >IN +2! ELSE DROP 0 0 THEN 7 EXIT THEN MAUVAISE_OPERANDE ; : SP_TAILLE ( --> taille 0,1 OU 2 ) PAD 2@ >IN 2@ + DUP C@ 2E = ( . ) IF 1+ C@ DUP 42 = OVER 53 = OR ( B ou S ) IF DROP 0 2 >IN +2! ELSE DUP 57 = ( W ) IF DROP 1 2 >IN +2! ELSE 4C = ( L ) IF 2 2 >IN +2! ELSE MAUVAISE_OPERANDE THEN THEN THEN ELSE DROP 1 THEN ; : SP_MODES ( operande,extension,registre,mode,taille --> - ) OVER 5 < IF DROP DROP DROP DROP DROP ELSE OVER 5 = IF DROP DROP DROP DROP , ELSE SWAP 6 = IF DROP DROP DUP , DUP 100 AND IF DUP >R 30 AND DUP 10 > IF 20 = IF , ELSE 2, THEN ELSE DROP DROP THEN R> 3 AND DUP 2 = IF DROP MEM_OD_ASM 2@ , ELSE 3 = IF MEM_OD_ASM 2@ 2, THEN THEN ELSE DROP DROP THEN ELSE SWAP ?DUP IF 1- ?DUP IF DUP 2 > IF DROP SWAP DROP ?DUP IF 1- IF 2, ELSE , THEN ELSE FF AND , THEN ELSE SWAP DROP >R >R HERE - R> R> 1- IF DUP 100 AND IF DUP , DUP 30 AND 30 = IF SWAP 2, ELSE SWAP PASSE_ASM @ IF DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN , ELSE DROP 0 , THEN THEN 3 AND DUP 2 = IF DROP MEM_OD_ASM 2@ , ELSE 3 = IF MEM_OD_ASM 2@ 2, THEN THEN ELSE FF00 AND PASSE_ASM @ IF OVER -80 < 3 PICK 7F > OR IF MAUVAIS_BRANCHEMENT THEN SWAP FF AND + , ELSE , DROP THEN THEN ELSE DROP PASSE_ASM @ IF DUP -8000 < OVER 7FFF > OR IF MAUVAIS_BRANCHEMENT THEN , ELSE DROP 0 , THEN THEN THEN ELSE DROP DROP 2, THEN ELSE DROP DROP DUP -8000 < OVER 7FFF > OR PASSE_ASM @ AND IF MAUVAIS_DECALAGE THEN , THEN THEN THEN THEN ; : SP_TST_CCR ( - --> b a 0 si pas de CCR ) PAD 2@ >IN 2@ + DUP C@ 43 = OVER 1+ C@ 43 = AND SWAP 2+ C@ 52 = AND IF 3 >IN +2! -1 ELSE 0 THEN ; : SP_TST_SR ( - --> b a 0 si pas de SR ) PAD 2@ >IN 2@ + DUP C@ 53 = SWAP 1+ C@ 52 = AND IF 2 >IN +2! -1 ELSE 0 THEN ; : SP_TST_USP ( - --> b a 0 si pas de USP ) PAD 2@ >IN 2@ + DUP C@ 55 = OVER 1+ C@ 53 = AND SWAP 2+ C@ 50 = AND IF 3 >IN +2! -1 ELSE 0 THEN ; HEX ( Directives d'assemblage ) : INST_DC ( 0 --> - ) DROP SP_TAILLE OPERANDE? BEGIN ADRESSE_EFFECTIVE 7 = SWAP 2 < AND IF DROP OVER ?DUP IF 1- IF 2, ELSE , THEN ELSE C, THEN ELSE MAUVAISE_OPERANDE THEN SP_TST_, 0= UNTIL DROP HERE DUP 1 AND + >HERE ; : INST_END ( 0 --> - ) DROP PASSE_ASM @ 0= IF PAD_ASM 2@ PAD 2! >IN_ASM 2@ >IN 2! HERE_ASM 2@ >HERE THEN 1 PASSE_ASM +! ; : INST_EQU ( 0 --> - ) DROP OPERANDE? ADRESSE_EFFECTIVE 7 = SWAP 2 < AND ETQ_ASM @ 0= AND IF DROP PASSE_ASM @ IF DROP ELSE POINTEUR_ASM 2@ DUP C@ 1+ DUP 1 AND + + 2! THEN EXIT THEN MAUVAISE_OPERANDE ; : INST_ORG ( 0 --> - ) DROP OPERANDE? ADRESSE_EFFECTIVE 7 = SWAP 2 < AND ETQ_ASM @ 0= AND IF DROP DUP 1 AND + >HERE EXIT THEN MAUVAISE_OPERANDE ; : INST_RM ( 0 --> - ) DROP SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE 7 = SWAP 2 < AND ETQ_ASM @ 0= AND IF DROP SWAP ?DUP IF 1- IF 4* ELSE 2* THEN THEN HERE OVER OVER + >HERE SWAP 0 FILL HERE DUP 1 AND + >HERE EXIT THEN MAUVAISE_OPERANDE ; ( Instructions ) : INST_ILLEGAL ( code --> - ) , ; : INST_SWAP ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 0= IF >R DROP DROP R> + , EXIT THEN MAUVAISE_OPERANDE ; : INST_EXT ( code --> - ) SP_TAILLE ?DUP IF 1- 6 LSH + INST_SWAP EXIT THEN MAUVAISE_OPERANDE ; : INST_UNLK ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 1 = IF >R DROP DROP R> + , EXIT THEN MAUVAISE_OPERANDE ; : INST_EXG ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 5 PICK 0= OVER 0= AND IF DROP >R DROP DROP DROP 9 LSH >R DROP DROP 40+ R> + R> + , EXIT ELSE 5 PICK 1 = OVER 1 = AND IF DROP >R DROP DROP DROP 9 LSH >R DROP DROP 48+ R> + R> + , EXIT ELSE 5 PICK 0= OVER 1 = AND IF DROP >R DROP DROP DROP 9 LSH >R DROP DROP 88+ R> + R> + , EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_LINK ( code --> - ) SP_TAILLE ?DUP IF DUP >R 1 = IF 650+ ELSE 8+ THEN R> SWAP OPERANDE? ADRESSE_EFFECTIVE 1 = IF >R DROP DROP R> + , SP_TST_, IF ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF 5 ROLL SP_MODES EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOVEQ ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 7 = >R 4 = >R DROP DUP -80 < OVER 7F > OR NOT R> AND R> AND IF FF AND + SP_TST_, IF ADRESSE_EFFECTIVE 0= IF 9 LSH >R DROP DROP R> + , EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_TRAP ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 7 = >R 4 = >R DROP DUP 10 U< R> AND R> AND IF + , EXIT THEN MAUVAISE_OPERANDE ; : INST_DBCC ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 0= IF >R DROP DROP R> + , SP_TST_, IF ADRESSE_EFFECTIVE 7 = SWAP 2 < AND IF 2 7 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BCC ( code --> - ) HERE SP_TAILLE DUP 2 < IF OPERANDE? ADRESSE_EFFECTIVE 7 = SWAP 2 < AND IF DROP 2- OVER ?DUP IF 1- IF 130 ELSE 120 THEN ELSE 0 THEN 3 7 0 SP_MODES IF ! ELSE DUP >R 1+ C@ FF AND + R> ! THEN EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_ABCD ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 5 PICK 0= OVER 0= AND IF DROP 9 LSH >R DROP DROP DROP >R DROP DROP R> + R> + , EXIT ELSE 5 PICK 4 = OVER 4 = AND IF DROP 9 LSH >R DROP DROP DROP >R DROP DROP R> + R> + 8+ , EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ADDX ( code --> - ) SP_TAILLE 6 LSH + INST_ABCD ; : INST_CMPM ( code --> - ) SP_TAILLE 6 LSH + OPERANDE? ADRESSE_EFFECTIVE 3 = SP_TST_, AND IF ADRESSE_EFFECTIVE 3 = IF 9 LSH >R DROP DROP >R DROP DROP R> + R> + , EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_MOVEP ( code --> - ) SP_TAILLE ?DUP IF 1- 6 LSH + OPERANDE? ADRESSE_EFFECTIVE DUP 0= OVER 5 = OR SP_TST_, AND IF ADRESSE_EFFECTIVE 5 PICK 0= OVER 5 = AND IF DROP >R DROP >R DROP 9 LSH 80+ >R DROP DROP R> + R> SWAP R> + , , EXIT ELSE 5 PICK 5 = OVER 0= AND IF DROP 9 LSH >R DROP DROP DROP >R DROP SWAP R> + R> + , , EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : SP_AD_EF OPERANDE? ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + , ; : INST_NBCD ( code --> - ) SP_AD_EF OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN MAUVAISE_OPERANDE ; : INST_CLR ( code --> - ) SP_TAILLE 6 LSH + INST_NBCD ; : INST_TST ( code --> - ) SP_TAILLE 6 LSH + SP_AD_EF OVER 4 = OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN MAUVAISE_OPERANDE ; : INST_JMP ( code --> - ) SP_AD_EF OVER 4 = OVER 7 = AND OVER 2 < OR OVER 3 = OR OVER 4 = OR NOT IF 0 SP_MODES EXIT THEN MAUVAISE_OPERANDE ; : INST_LEA ( code --> - ) HERE 0 INST_JMP SP_TST_, IF ADRESSE_EFFECTIVE 1 = IF 9 LSH >R DROP DROP SWAP R> + SWAP +! EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_ADDQ ( code --> - ) SP_TAILLE 6 LSH + OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF DROP DROP DROP PASSE_ASM @ IF DUP 1 < OVER 8 > OR IF MAUVAIS_DECALAGE THEN 7 AND 9 LSH ELSE DROP 0 THEN + SP_TST_, IF ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + OVER 1 = OVER C0 AND 0= AND 4 PICK 1 > 4 PICK 7 = AND OR NOT IF , 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ADDI ( code --> - ) SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF HERE >R 0 , 5 PICK SP_MODES R> SP_TST_, IF ADRESSE_EFFECTIVE OVER OVER 3 LSH + 7 ROLL 6 LSH + 7 ROLL + 6 ROLL ! OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_CMPI ( code --> - ) SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF HERE >R 0 , 5 PICK SP_MODES R> SP_TST_, IF ADRESSE_EFFECTIVE OVER OVER 3 LSH + 7 ROLL 6 LSH + 7 ROLL + 6 ROLL ! OVER 4 = OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ANDI ( code --> - ) SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF HERE >R 0 , 5 PICK SP_MODES R> SP_TST_, IF OVER 1 = SP_TST_CCR AND IF ROT 3C+ SWAP ! DROP EXIT ELSE OVER 1 = SP_TST_SR AND IF ROT 7C+ SWAP ! DROP EXIT ELSE ADRESSE_EFFECTIVE OVER OVER 3 LSH + 7 ROLL 6 LSH + 7 ROLL + 6 ROLL ! OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ASL ( code --> - ) SP_TAILLE 6 LSH + OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND OVER 0 = OR IF 7 = IF DROP DROP PASSE_ASM @ IF DUP 1 < OVER 8 > OR IF MAUVAIS_DECALAGE THEN 7 AND 9 LSH ELSE DROP 0 THEN ELSE >R DROP DROP R> 9 LSH 20+ THEN + SP_TST_, IF ADRESSE_EFFECTIVE 0= IF >R DROP DROP R> + , EXIT THEN THEN ELSE 5 PICK C0 AND 0= IF OVER OVER 3 LSH + 6 ROLL DUP FFE7 AND SWAP 18 AND 6 LSH OR C0 OR + , OVER 1 > OVER 7 = AND OVER 2 < OR NOT IF 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_ADD ( code --> - ) SP_TAILLE DUP >R 6 LSH + R> OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 9 PICK 0= 6 PICK 1 = AND NOT OVER 0= AND IF DROP 9 LSH >R DROP DROP OVER OVER 3 LSH + R> + 7 ROLL + , 5 ROLL SP_MODES EXIT ELSE OVER 1 > OVER 7 = AND NOT OVER 1 > AND 6 PICK 0= AND IF >R >R >R >R DROP 9 LSH 100+ >R DROP DROP SWAP R> + R> R> R> R> OVER OVER 3 LSH + 6 ROLL + , 5 ROLL SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_AND ( code --> - ) SP_TAILLE DUP >R 6 LSH + R> OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 5 PICK 1 = NOT OVER 0= AND IF DROP 9 LSH >R DROP DROP OVER OVER 3 LSH + R> + 7 ROLL + , 5 ROLL SP_MODES EXIT ELSE OVER 1 > OVER 7 = AND NOT OVER 1 > AND 6 PICK 0= AND IF >R >R >R >R DROP 9 LSH 100+ >R DROP DROP SWAP R> + R> R> R> R> OVER OVER 3 LSH + 6 ROLL + , 5 ROLL SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_CMP ( code --> - ) SP_TAILLE DUP >R 6 LSH + R> OPERANDE? ADRESSE_EFFECTIVE 5 PICK 0= OVER 1 = AND NOT SP_TST_, AND IF ADRESSE_EFFECTIVE 0= IF 9 LSH >R DROP DROP OVER OVER 3 LSH + R> + 7 ROLL + , 5 ROLL SP_MODES EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_EOR ( code --> - ) SP_TAILLE 6 LSH + OPERANDE? ADRESSE_EFFECTIVE 0= SP_TST_, AND IF 9 LSH >R DROP DROP R> + ADRESSE_EFFECTIVE OVER 1 > OVER 7 = AND NOT OVER 1 = NOT AND IF OVER OVER 3 LSH + 6 ROLL + , 0 SP_MODES EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_ADDA ( code --> - ) SP_TAILLE ?DUP IF OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 1 = IF 9 LSH >R DROP DROP OVER OVER 3 LSH + 7 ROLL + 6 PICK 1- 8 LSH + R> + , 5 ROLL SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOVEA ( code --> - ) SP_TAILLE ?DUP IF OPERANDE? ADRESSE_EFFECTIVE SP_TST_, IF ADRESSE_EFFECTIVE 1 = IF 9 LSH >R DROP DROP OVER OVER 3 LSH + 7 ROLL + 6 PICK 1+ DUP 1 > 1 AND XOR C LSH + R> + , 5 ROLL SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOVE ( code --> - ) SP_TAILLE OPERANDE? SP_TST_SR IF 1 = SP_TST_, AND IF DROP 40C0 ADRESSE_EFFECTIVE OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF OVER OVER 3 LSH + 6 ROLL + , 1 SP_MODES EXIT THEN THEN ELSE SP_TST_USP IF 2 = SP_TST_, AND IF DROP 4E68 ADRESSE_EFFECTIVE 1 = IF >R DROP DROP R> + , EXIT THEN THEN ELSE ADRESSE_EFFECTIVE 5 PICK 0= OVER 1 = AND NOT SP_TST_, AND IF SP_TST_CCR IF 5 PICK 1 = OVER 1 = NOT AND IF OVER OVER 3 LSH + 44C0+ , 1 SP_MODES DROP DROP EXIT THEN ELSE SP_TST_SR IF 5 PICK 1 = OVER 1 = NOT AND IF OVER OVER 3 LSH + 46C0+ , 1 SP_MODES DROP DROP EXIT THEN ELSE SP_TST_USP IF 5 PICK 2 = OVER 1 = AND IF DROP 4E60+ , DROP DROP DROP DROP EXIT THEN ELSE ADRESSE_EFFECTIVE OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF OVER 3 LSH OVER + 6 LSH 7 PICK 7 PICK 3 LSH + + A PICK 1+ DUP 1 > 1 AND XOR C LSH + B ROLL + , >R >R >R >R 5 ROLL SP_MODES R> R> R> R> 0 SP_MODES EXIT THEN THEN THEN THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MOVEM ( code --> - ) SP_TAILLE ?DUP IF 1- 6 LSH + OPERANDE? ADRESSE_EFFECTIVE DUP 2 < IF >R >R >R >R 0 R> R> R> R> BEGIN 3 LSH + >R DROP DROP 1 R> LSH OR SP_TST_/ WHILE ADRESSE_EFFECTIVE DUP 2 < NOT IF MAUVAISE_OPERANDE THEN REPEAT SP_TST_, IF ADRESSE_EFFECTIVE OVER 1 > OVER 7 = AND OVER 3 = OR OVER 2 < OR NOT IF OVER OVER 3 LSH + 7 ROLL + , 5 ROLL OVER 4 = IF 0 10 0 DO 2* OVER 1 AND + >R 2/ R> LOOP >R DROP R> THEN , 0 SP_MODES EXIT THEN THEN ELSE OVER 4 = OVER 7 = AND OVER 4 = OR NOT SP_TST_, AND IF OVER OVER 3 LSH + 6 ROLL + 400+ , 0 BEGIN ADRESSE_EFFECTIVE DUP 2 < IF 3 LSH + >R DROP DROP 1 R> LSH OR ELSE MAUVAISE_OPERANDE THEN SP_TST_/ 0= UNTIL , 0 SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_CHK ( code --> - ) SP_TAILLE DUP 1 = IF OPERANDE? ADRESSE_EFFECTIVE DUP 1 = NOT SP_TST_, AND IF ADRESSE_EFFECTIVE 0= IF 9 LSH >R DROP DROP OVER OVER 3 LSH + R> + 7 ROLL + 6 PICK 1+ DUP 1 > 1 AND XOR 7 LSH + , 5 ROLL SP_MODES EXIT THEN THEN THEN MAUVAISE_OPERANDE ; : INST_BCHG ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND OVER 0= OR SP_TST_, AND IF ?DUP IF >R >R >R >R FF AND 800+ ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + , R> R> R> R> 0 SP_MODES ELSE 9 LSH >R DROP DROP R> + ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + , THEN OVER 1 > OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_BTST ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND OVER 0= OR SP_TST_, AND IF ?DUP IF >R >R >R >R FF AND 800+ ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + , R> R> R> R> 0 SP_MODES ELSE 9 LSH >R DROP DROP R> + ADRESSE_EFFECTIVE OVER OVER 3 LSH + 6 ROLL + , THEN OVER 4 = OVER 7 = AND OVER 1 = OR NOT IF 0 SP_MODES EXIT THEN THEN MAUVAISE_OPERANDE ; : INST_DIVS ( code --> - ) SP_TAILLE DUP 1 = IF OPERANDE? ADRESSE_EFFECTIVE 5 PICK OVER 1 = NOT AND SP_TST_, AND IF ADRESSE_EFFECTIVE 0= IF >R DROP DROP R> SP_TST_: IF ADRESSE_EFFECTIVE 0= A PICK 2 = AND IF C LSH >R DROP DROP R> + >R OVER OVER 3 LSH + 4C40+ , 6 ROLL 100 AND 3 LSH R> + 400+ , 5 ROLL SP_MODES EXIT THEN ELSE 6 PICK 2 = IF >R OVER OVER 3 LSH + 4C40+ , R> DUP C LSH + 7 ROLL 100 AND 3 LSH + ELSE 9 LSH >R OVER OVER 3 LSH + R> + 7 ROLL + THEN , 5 ROLL SP_MODES EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_MULS ( code --> - ) SP_TAILLE DUP 1 = IF OPERANDE? ADRESSE_EFFECTIVE 5 PICK OVER 1 = NOT AND SP_TST_, AND IF ADRESSE_EFFECTIVE 0= IF >R DROP DROP R> SP_TST_: IF ADRESSE_EFFECTIVE 0= A PICK 2 = AND IF C LSH >R DROP DROP R> + >R OVER OVER 3 LSH + 4C00+ , 6 ROLL 100 AND 3 LSH R> + 400+ , 5 ROLL SP_MODES EXIT THEN ELSE 6 PICK 2 = IF >R OVER OVER 3 LSH + 4C00+ , R> C LSH 7 ROLL 100 AND 3 LSH + ELSE 9 LSH >R OVER OVER 3 LSH + R> + 7 ROLL + THEN , 5 ROLL SP_MODES EXIT THEN THEN THEN THEN MAUVAISE_OPERANDE ; : INST_STOP ( code --> - ) , OPERANDE? ADRESSE_EFFECTIVE OVER 4 = OVER 7 = AND IF 1 SP_MODES EXIT THEN MAUVAISE_OPERANDE ; HEX " ABCD" C100 FIND INST_ABCD INS_ASM " ADD" D000 FIND INST_ADD INS_ASM " ADDA" D0C0 FIND INST_ADDA INS_ASM " ADDI" 0600 FIND INST_ADDI INS_ASM " ADDQ" 5000 FIND INST_ADDQ INS_ASM " ADDX" D100 FIND INST_ADDX INS_ASM " AND" C000 FIND INST_AND INS_ASM " ANDI" 0200 FIND INST_ANDI INS_ASM " ASL" E100 FIND INST_ASL INS_ASM " ASR" E000 FIND INST_ASL INS_ASM " BCC" 6400 FIND INST_BCC INS_ASM " BCS" 6500 FIND INST_BCC INS_ASM " BEQ" 6700 FIND INST_BCC INS_ASM " BNE" 6600 FIND INST_BCC INS_ASM " BMI" 6B00 FIND INST_BCC INS_ASM " BPL" 6A00 FIND INST_BCC INS_ASM " BVC" 6800 FIND INST_BCC INS_ASM " BVS" 6900 FIND INST_BCC INS_ASM " BHI" 6200 FIND INST_BCC INS_ASM " BLS" 6300 FIND INST_BCC INS_ASM " BGE" 6C00 FIND INST_BCC INS_ASM " BLT" 6D00 FIND INST_BCC INS_ASM " BGT" 6E00 FIND INST_BCC INS_ASM " BLE" 6F00 FIND INST_BCC INS_ASM " BCHG" 0140 FIND INST_BCHG INS_ASM " BCLR" 0180 FIND INST_BCHG INS_ASM " BRA" 6000 FIND INST_BCC INS_ASM " BSET" 01C0 FIND INST_BCHG INS_ASM " BSR" 6100 FIND INST_BCC INS_ASM " BTST" 0100 FIND INST_BTST INS_ASM " CHK" 4000 FIND INST_CHK INS_ASM " CLR" 4200 FIND INST_CLR INS_ASM " CMP" B000 FIND INST_CMP INS_ASM " CMPA" B0C0 FIND INST_ADDA INS_ASM " CMPI" 0C00 FIND INST_CMPI INS_ASM " CMPM" B108 FIND INST_CMPM INS_ASM " DBCC" 54C8 FIND INST_DBCC INS_ASM " DBCS" 55C8 FIND INST_DBCC INS_ASM " DBEQ" 57C8 FIND INST_DBCC INS_ASM " DBNE" 56C8 FIND INST_DBCC INS_ASM " DBGE" 5CC8 FIND INST_DBCC INS_ASM " DBGT" 5EC8 FIND INST_DBCC INS_ASM " DBHI" 52C8 FIND INST_DBCC INS_ASM " DBLE" 5FC8 FIND INST_DBCC INS_ASM " DBLS" 53C8 FIND INST_DBCC INS_ASM " DBLT" 5DC8 FIND INST_DBCC INS_ASM " DBMI" 5BC8 FIND INST_DBCC INS_ASM " DBPL" 5AC8 FIND INST_DBCC INS_ASM " DBVC" 58C8 FIND INST_DBCC INS_ASM " DBVS" 59C8 FIND INST_DBCC INS_ASM " DBT" 50C8 FIND INST_DBCC INS_ASM " DBF" 51C8 FIND INST_DBCC INS_ASM " DC" 0000 FIND INST_DC INS_ASM " DIVS" 81C0 FIND INST_DIVS INS_ASM " DIVU" 80C0 FIND INST_DIVS INS_ASM " END" 0000 FIND INST_END INS_ASM " EOR" B100 FIND INST_EOR INS_ASM " EORI" 0A00 FIND INST_ANDI INS_ASM " EQU" 0000 FIND INST_EQU INS_ASM " EXG" C100 FIND INST_EXG INS_ASM " EXT" 4880 FIND INST_EXT INS_ASM " ILLEGAL" 4AFC FIND INST_ILLEGAL INS_ASM " JMP" 4EC0 FIND INST_JMP INS_ASM " JSR" 4E80 FIND INST_JMP INS_ASM " LEA" 41C0 FIND INST_LEA INS_ASM " LINK" 4800 FIND INST_LINK INS_ASM " LSL" E108 FIND INST_ASL INS_ASM " LSR" E008 FIND INST_ASL INS_ASM " MOVE" 0000 FIND INST_MOVE INS_ASM " MOVEA" 0040 FIND INST_MOVEA INS_ASM " MOVEM" 4880 FIND INST_MOVEM INS_ASM " MOVEP" 0108 FIND INST_MOVEP INS_ASM " MOVEQ" 7000 FIND INST_MOVEQ INS_ASM " MULS" C1C0 FIND INST_MULS INS_ASM " MULU" C0C0 FIND INST_MULS INS_ASM " NBCD" 4800 FIND INST_NBCD INS_ASM " NEG" 4400 FIND INST_CLR INS_ASM " NEGX" 4000 FIND INST_CLR INS_ASM " NOP" 4E71 FIND INST_ILLEGAL INS_ASM " NOT" 4600 FIND INST_CLR INS_ASM " OR" 8000 FIND INST_AND INS_ASM " ORG" 0000 FIND INST_ORG INS_ASM " ORI" 0000 FIND INST_ANDI INS_ASM " PEA" 4840 FIND INST_JMP INS_ASM " RESET" 4E70 FIND INST_ILLEGAL INS_ASM " RM" 0000 FIND INST_RM INS_ASM " ROL" E118 FIND INST_ASL INS_ASM " ROR" E018 FIND INST_ASL INS_ASM " ROXL" E110 FIND INST_ASL INS_ASM " ROXR" E010 FIND INST_ASL INS_ASM " RTE" 4E73 FIND INST_ILLEGAL INS_ASM " RTR" 4E77 FIND INST_ILLEGAL INS_ASM " RTS" 4E75 FIND INST_ILLEGAL INS_ASM " SBCD" 8100 FIND INST_ABCD INS_ASM " SCC" 54C0 FIND INST_NBCD INS_ASM " SCS" 55C0 FIND INST_NBCD INS_ASM " SEQ" 57C0 FIND INST_NBCD INS_ASM " SNE" 56C0 FIND INST_NBCD INS_ASM " SGE" 5CC0 FIND INST_NBCD INS_ASM " SGT" 5EC0 FIND INST_NBCD INS_ASM " SHI" 52C0 FIND INST_NBCD INS_ASM " SLE" 5FC0 FIND INST_NBCD INS_ASM " SLS" 53C0 FIND INST_NBCD INS_ASM " SLT" 5DC0 FIND INST_NBCD INS_ASM " SMI" 5BC0 FIND INST_NBCD INS_ASM " SPL" 5AC0 FIND INST_NBCD INS_ASM " SVC" 58C0 FIND INST_NBCD INS_ASM " SVS" 59C0 FIND INST_NBCD INS_ASM " ST" 50C0 FIND INST_NBCD INS_ASM " SF" 51C0 FIND INST_NBCD INS_ASM " STOP" 4E72 FIND INST_STOP INS_ASM " SUB" 9000 FIND INST_ADD INS_ASM " SUBA" 90C0 FIND INST_ADDA INS_ASM " SUBI" 0400 FIND INST_ADDI INS_ASM " SUBQ" 5100 FIND INST_ADDQ INS_ASM " SUBX" 9100 FIND INST_ADDX INS_ASM " SWAP" 4840 FIND INST_SWAP INS_ASM " TAS" 4AC0 FIND INST_NBCD INS_ASM " TRAP" 4E40 FIND INST_TRAP INS_ASM " TRAPV" 4E76 FIND INST_ILLEGAL INS_ASM " TST" 4A00 FIND INST_TST INS_ASM " UNLK" 4E58 FIND INST_UNLK 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 ; : ASSEMBLEUR INIT_ASM @ 0= IF RAZ_ASSEMBLEUR THEN PAD 2@ PAD_ASM 2! >IN 2@ 1- DUP >IN 2! >IN_ASM 2! HERE HERE_ASM 2! 0 PASSE_ASM ! BEGIN HERE MEM_HERE_ASM 2! 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 TAMPON_ASM INSERE_ETIQUETTE THEN PAD 2@ >IN 2@ + C@ DUP 0< OVER 32 = OR IF 1 >IN +2! 32 = IF PAD 2@ >IN 2@ BEGIN OVER OVER + C@ 32 = IF 1+ 0 ELSE -1 THEN UNTIL >IN 2! DROP THEN TAMPON_ASM TMP_ASM TABLE_ASM DICO_CHERCHE IF AF_MAUVAISE_LIGNE ." **** Instruction assembleur inconnue !" ABORT ELSE 2@ DUP C@ 1+ DUP 1 AND + + DUP 2@ SWAP 4+ @ DEPTH SWAP ROT EXECUTE DEPTH 1+ - IF AF_MAUVAISE_LIGNE ." **** Probleme de pile !" ABORT THEN PAD 2@ >IN 2@ + C@ 32 > IF AF_MAUVAISE_LIGNE ." **** Syntaxe incorrecte !" ABORT THEN THEN ELSE DUP 59 = SWAP 32 U< OR NOT IF AF_MAUVAISE_LIGNE ." **** Ligne incorrecte !" ABORT THEN THEN THEN THEN PASSE_ASM @ 2 < IF PAD 2@ >IN 2@ + BEGIN DUP C@ 32 U< NOT 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 [ FIND MEMOIRE_LIBERE LITERAL ] ?DUP IF DEBUT_ASM SWAP EXECUTE DROP THEN ; 0 INIT_ASM ! ANCIEN_HERE >HERE DICO_INIT ( FIN )