( Assembleur/Simulateur pour coeur FORTH 32 bits. Version 1.00 du 11 Juin 2006. Ecrit par jpb.forth . ) TELECHARGEMENT ( Assembleur/Simulateur utilisant 65536 octets de 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. Une ligne ne peut contenir qu'une seule instruction, la concatenation de 2 ou 3 instructions est geree automatiquement. Un code ne contenant qu'1 ou 2 instruction(s) unaire(s) est complete par 1 ou 2 "nop". Une etiquette placee devant une instruction provoque l'alignement de ou des instructions precedentes ("nop" de bourrage). Syntaxe des instructions avec argument: CALLA ETIQUETTE ; adressage absolu 32 bits toujours pair JZ ETIQUETTE ; adressage relatif 11 bits toujours pair LIT #1234 ; adressage immediat 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 >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 PNTIND_ASM 0 VARIABLE MEM_HERE_ASM 0 VARIABLE TAILLE_CODE_ASM 0 VARIABLE ORG_ASM HERE 80 ALLOT CONSTANT TMP_ASM HERE 200 ALLOT CONSTANT TABLE_ASM 0 VARIABLE A_SIM 0 VARIABLE PC_SIM 2 CONSTANT PNTT_SIM 3 CONSTANT PNTR_SIM 4 CONSTANT CE_SIM 5 CONSTANT SA_SIM 8 CONSTANT SCE_SIM HERE 800 ALLOT CONSTANT EXT_SIM 0 VARIABLE ADRESSE_SIM 0 ADRESSE_SIM 2! 0 VARIABLE NUMERO_SIM 0 VARIABLE ERREUR_CODE_SIM 0 VARIABLE INDEX_CODE_SIM 0 VARIABLE INDEX_MOT_SIM HERE 80 ALLOT CONSTANT TMP_SIM : 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 , ) 2C 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 ; : AF_CODE_ASM INDEX_ASM @ 0= IF PASSE_ASM @ IF MEM_HERE_ASM 2@ HERE OVER - BEGIN DUP 0> WHILE BASE @ >R HEX SPACE 3C EMIT OVER ORG_ASM 2@ + 0 <# DROP SWAP # # # # # # # # #> TYPE 3E EMIT SPACE DUP >R 10 MIN TAILLE_CODE_ASM @ ?DUP IF 1- IF 0 DO DUP 2@ 0 <# DROP SWAP # # # # # # # # #> TYPE SPACE 4+ 4 +LOOP ELSE 0 DO DUP @ FFFF AND <# # # # # #> TYPE SPACE 2+ 2 +LOOP THEN ELSE 0 DO DUP C@ FF AND <# # # #> TYPE SPACE 1+ LOOP THEN CR R> 10- R> BASE ! REPEAT DROP DROP 1 TAILLE_CODE_ASM ! 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_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@ + 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@ ORG_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_LIGNE_ASM ." **** Adresse FORTH introuvable !" ABORT THEN ELSE DUP C@ 27 = ( ' ) IF 1 >IN +2! 1+ C@ DUP 0> OVER 1F > AND IF 1 >IN +2! ELSE AF_LIGNE_ASM ." **** Caractere INCORRECT !" 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 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,mode ) PAD 2@ >IN 2@ + C@ 23 = ( # ) IF 1 >IN +2! ADRESSE_EFFECTIVE 0= IF -1 ELSE MAUVAISE_OPERANDE THEN ELSE 0 ETQ_ASM ! DECODE_NOMBRE 0 THEN ; : 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 ; HEX ( Directives d'assemblage ) : INST_DC ( 0 --> - ) DROP SP_TAILLE OPERANDE? 0 INDEX_ASM ! BEGIN ADRESSE_EFFECTIVE 0= IF OVER ?DUP IF 1- IF 2, ELSE , THEN ELSE C, THEN ELSE MAUVAISE_OPERANDE THEN SP_TST_, 0= UNTIL TAILLE_CODE_ASM ! HERE DUP 1 AND + >HERE ; : 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= ETQ_ASM @ 0= AND IF DUP 1 AND + MEM_HERE_ASM 2@ - ORG_ASM 2! EXIT THEN MAUVAISE_OPERANDE ; : INST_RM ( 0 --> - ) DROP 0 INDEX_ASM ! SP_TAILLE OPERANDE? ADRESSE_EFFECTIVE 0= ETQ_ASM @ 0= AND IF SWAP DUP TAILLE_CODE_ASM ! ?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 ; DECIMAL ( Instructions pour assemblage ) : INST_CALLA ( code --> - ) OPERANDE? ADRESSE_EFFECTIVE 0= IF 0 INDEX_ASM ! AF_CODE_ASM OR SWAB 2, EXIT THEN MAUVAISE_OPERANDE ; : INST_JMP ( code --> - ) [ 31 5 LSH 5 LSH 2* LITERAL ] AND OPERANDE? ADRESSE_EFFECTIVE 0= IF 0 INDEX_ASM ! AF_CODE_ASM PASSE_ASM @ IF 2- MEM_HERE_ASM 2@ ORG_ASM 2@ + - DUP -1024 < OVER 1023 > OR OVER 1 AND OR IF MAUVAIS_BRANCHEMENT THEN 2046 AND + ELSE DROP THEN , EXIT THEN MAUVAISE_OPERANDE ; : INST_FCW ( code --> - ) INDEX_ASM DUP >R @ ?DUP IF 1- IF [ 31 2* LITERAL ] AND PNTIND_ASM 2@ DUP >R @ [ 31 5 LSH 31+ 5 LSH 2* LITERAL ] AND + R> ! 0 ELSE [ 31 5 LSH 2* LITERAL ] AND PNTIND_ASM 2@ DUP >R @ [ 31 5 LSH 5 LSH 31+ 2* LITERAL ] AND + R> ! 2 THEN ELSE MEM_HERE_ASM 2@ PNTIND_ASM 2! [ 31 5 LSH 5 LSH 2* LITERAL ] AND [ 30 ( code de "NOP" ) 5 LSH 30+ 2* LITERAL ] + , 1 THEN R> ! ; : INST_RET ( code --> - ) INST_FCW 0 INDEX_ASM ! ; : INST_LIT ( code --> - ) INST_FCW OPERANDE? ADRESSE_EFFECTIVE IF , EXIT THEN MAUVAISE_OPERANDE ; DECIMAL ( Instructions pour simulation ) : EXT@_SIM ( num --> N ) 1023 AND DUP 255 > IF 1023 AND 4* EXT_SIM + 2@ ELSE DUP CASE 1023 AND 4* EXT_SIM + 2@ PNTT_SIM OF 255 AND 512+ ENDOF PNTR_SIM OF 255 AND 768+ ENDOF CE_SIM OF 63488 AND DUP 32768 AND IF -65536+ THEN ENDOF SA_SIM OF ENDOF 65535 AND DUP 32768 AND IF -65536+ THEN ENDCASE THEN ; : EXT!_SIM ( n, num --> - ) DUP >R CASE PNTT_SIM OF 255 AND 512+ ENDOF PNTR_SIM OF 255 AND 768+ ENDOF CE_SIM OF 63488 AND ENDOF ENDCASE R> 1023 AND 4* EXT_SIM + 2! ; : >PNTT_SIM ( n --> - ) PNTT_SIM EXT@_SIM 1- PNTT_SIM EXT!_SIM PNTT_SIM EXT@_SIM EXT!_SIM ; : PNTT>_SIM ( - --> n ) PNTT_SIM EXT@_SIM DUP 1+ PNTT_SIM EXT!_SIM EXT@_SIM ; : >PNTR_SIM ( n --> - ) PNTR_SIM EXT@_SIM 1- PNTR_SIM EXT!_SIM PNTR_SIM EXT@_SIM EXT!_SIM ; : PNTR>_SIM ( - --> n ) PNTR_SIM EXT@_SIM DUP 1+ PNTR_SIM EXT!_SIM EXT@_SIM ; : CALLA_SIM ( n --> - ) 65534 AND PC_SIM 2@ DUP >R @ 65535 AND DUP BASE @ >R HEX <# # # # # #> >R TMP_ASM INDEX_CODE_SIM @ + R> CMOVE 5 INDEX_CODE_SIM +! 16 LSH + DUP PC_SIM 2! DECIMAL 0 <# DROP SWAP #S #> >R TMP_ASM INDEX_MOT_SIM @ + 67 OVER C! 1+ 65 OVER C! 1+ 76 OVER C! 1+ 76 OVER C! 1+ 65 OVER C! 2+ R@ CMOVE R> 7+ INDEX_MOT_SIM +! R> BASE ! R> 2+ >PNTR_SIM ; : JMP_SIM ( n --> - ) 21 LSH -21 ASH PC_SIM DUP >R 2@ + DUP BASE @ >R DECIMAL 0 <# DROP SWAP #S #> >R TMP_ASM INDEX_MOT_SIM @ + 74 OVER C! 1+ 77 OVER C! 1+ 80 OVER C! 2+ R@ CMOVE R> 5+ INDEX_MOT_SIM +! R> BASE ! R> 2! ; : JZ_SIM ( n --> - ) 21 LSH -21 ASH PC_SIM DUP >R 2@ + DUP BASE @ >R DECIMAL 0 <# DROP SWAP #S #> >R TMP_ASM INDEX_MOT_SIM @ + 74 OVER C! 1+ 90 OVER C! 2+ R@ CMOVE R> 4+ INDEX_MOT_SIM +! R> BASE ! R> PNTT>_SIM DUP >PNTT_SIM IF DROP DROP ELSE 2! THEN ; : CALL_SIM ( n --> - ) 21 LSH -21 ASH PC_SIM 2@ DUP >R + DUP BASE @ >R DECIMAL 0 <# DROP SWAP #S #> >R TMP_ASM INDEX_MOT_SIM @ + 67 OVER C! 1+ 65 OVER C! 1+ 76 OVER C! 1+ 76 OVER C! 2+ R@ CMOVE R> 5+ INDEX_MOT_SIM +! PC_SIM 2! R> BASE ! R> >PNTR_SIM ; : JNC_SIM ( n --> - ) 21 LSH -21 ASH PC_SIM DUP >R 2@ + DUP BASE @ >R DECIMAL 0 <# DROP SWAP #S #> >R TMP_ASM INDEX_MOT_SIM @ + 74 OVER C! 1+ 78 OVER C! 1+ 67 OVER C! 2+ R@ CMOVE R> 5+ INDEX_MOT_SIM +! R> BASE ! R> CE_SIM EXT@_SIM 32768 AND IF DROP DROP ELSE 2! THEN ; : FCW_SIM TMP_ASM INDEX_MOT_SIM @ + 70 OVER C! 1+ 67 OVER C! 1+ 87 SWAP C! 4 INDEX_MOT_SIM +! PNTR>_SIM DUP >PNTR_SIM EXT@_SIM PNTR>_SIM DROP >PNTT_SIM ; : STCW_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 84 OVER C! 1+ 67 OVER C! 1+ 87 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTR>_SIM EXT!_SIM ; : RET_SIM TMP_ASM INDEX_MOT_SIM @ + 82 OVER C! 1+ 69 OVER C! 1+ 84 SWAP C! 4 INDEX_MOT_SIM +! PNTR>_SIM PC_SIM 2! ; : IRET_SIM TMP_ASM INDEX_MOT_SIM @ + 73 OVER C! 1+ 82 OVER C! 1+ 69 OVER C! 1+ 84 SWAP C! 5 INDEX_MOT_SIM +! SA_SIM EXT@_SIM A_SIM 2! PNTR>_SIM PC_SIM 2! SCE_SIM EXT@_SIM CE_SIM EXT!_SIM ; : FTCHRP_SIM TMP_ASM INDEX_MOT_SIM @ + 70 OVER C! 1+ 84 OVER C! 1+ 67 OVER C! 1+ 72 OVER C! 1+ 82 OVER C! 1+ 80 SWAP C! 7 INDEX_MOT_SIM +! PNTR>_SIM CE_SIM EXT@_SIM 4096 AND IF DUP >R 1+ R> C@ ELSE DUP >R 2+ R> -2 AND @ THEN 65535 AND >PNTT_SIM >PNTR_SIM ; : FTCHAP_SIM TMP_ASM INDEX_MOT_SIM @ + 70 OVER C! 1+ 84 OVER C! 1+ 67 OVER C! 1+ 72 OVER C! 1+ 65 OVER C! 1+ 80 SWAP C! 7 INDEX_MOT_SIM +! A_SIM 2@ CE_SIM EXT@_SIM 4096 AND IF DUP >R 1+ R> C@ ELSE DUP >R 2+ R> -2 AND @ THEN 65535 AND >PNTT_SIM A_SIM 2! ; : LIT_SIM PC_SIM 2@ @ 2 PC_SIM +2! DUP 65535 AND >PNTT_SIM DUP 65535 AND BASE @ >R HEX <# # # # # #> >R TMP_ASM INDEX_CODE_SIM @ + R> CMOVE 5 INDEX_CODE_SIM +! DECIMAL <# #S SIGN #> >R TMP_ASM INDEX_MOT_SIM @ + 76 OVER C! 1+ 73 OVER C! 1+ 84 OVER C! 2+ 35 OVER C! 1+ R@ CMOVE R> 6+ INDEX_MOT_SIM +! R> BASE ! CE_SIM EXT@_SIM 32767 AND CE_SIM EXT!_SIM ; : FTCHA_SIM TMP_ASM INDEX_MOT_SIM @ + 70 OVER C! 1+ 84 OVER C! 1+ 67 OVER C! 1+ 72 OVER C! 1+ 65 SWAP C! 6 INDEX_MOT_SIM +! A_SIM 2@ CE_SIM EXT@_SIM 4096 AND IF C@ ELSE -2 AND @ THEN 65535 AND >PNTT_SIM ; : STRP_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 84 OVER C! 1+ 82 OVER C! 1+ 80 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTR>_SIM CE_SIM EXT@_SIM 4096 AND IF DUP >R C! R> 1+ ELSE DUP >R -2 AND ! R> 2+ THEN >PNTR_SIM ; : STAP_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 84 OVER C! 1+ 65 OVER C! 1+ 80 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM A_SIM 2@ CE_SIM EXT@_SIM 4096 AND IF DUP >R C! R> 1+ ELSE DUP >R -2 AND ! R> 2+ THEN A_SIM 2! ; : STA_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 84 OVER C! 1+ 65 SWAP C! 4 INDEX_MOT_SIM +! PNTT>_SIM A_SIM 2@ CE_SIM EXT@_SIM 4096 AND IF C! ELSE -2 AND ! THEN ; : SWAB_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 87 OVER C! 1+ 65 OVER C! 1+ 66 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM SWAB >PNTT_SIM ; : COM_SIM TMP_ASM INDEX_MOT_SIM @ + 67 OVER C! 1+ 79 OVER C! 1+ 77 SWAP C! 4 INDEX_MOT_SIM +! PNTT>_SIM COM >PNTT_SIM ; : ROLC_SIM TMP_ASM INDEX_MOT_SIM @ + 82 OVER C! 1+ 79 OVER C! 1+ 76 OVER C! 1+ 67 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM DUP 0< CE_SIM EXT@_SIM DUP >R 32767 AND OR CE_SIM EXT!_SIM 2* R> 0< - >PNTT_SIM ; : RORC_SIM TMP_ASM INDEX_MOT_SIM @ + 82 OVER C! 1+ 79 OVER C! 1+ 82 OVER C! 1+ 67 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM CE_SIM EXT@_SIM DUP >R OVER 1 AND IF 32768 OR ELSE 32767 AND THEN CE_SIM EXT!_SIM 2/ R> 0< IF 2147483648 OR ELSE 2147483647 AND THEN >PNTT_SIM ; : ADDC_SIM TMP_ASM INDEX_MOT_SIM @ + 65 OVER C! 1+ 68 OVER C! 1+ 68 OVER C! 1+ 67 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM DUP 1 AND IF PNTT>_SIM DUP >PNTT_SIM OVER 0< >R DUP 0< >R + DUP 0< IF R> IF R> ELSE R> DROP 0 THEN ELSE R> IF R> DROP -1 ELSE R> THEN THEN 32768 AND ELSE 0 THEN CE_SIM EXT@_SIM 32767 AND OR CE_SIM EXT!_SIM >PNTT_SIM ; : XORR_SIM TMP_ASM INDEX_MOT_SIM @ + 88 OVER C! 1+ 79 OVER C! 1+ 82 OVER C! 1+ 82 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTT>_SIM XOR >PNTT_SIM ; : ANDD_SIM TMP_ASM INDEX_MOT_SIM @ + 65 OVER C! 1+ 78 OVER C! 1+ 68 OVER C! 1+ 68 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTT>_SIM AND >PNTT_SIM ; : SXT_SIM TMP_ASM INDEX_MOT_SIM @ + 83 OVER C! 1+ 88 OVER C! 1+ 84 OVER C! 1+ 68 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM DUP 32768 AND IF -32768 OR ELSE 32767 AND THEN >PNTT_SIM ; : ADDD_SIM TMP_ASM INDEX_MOT_SIM @ + 65 OVER C! 1+ 68 OVER C! 1+ 68 OVER C! 1+ 68 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTT>_SIM OVER 0< >R DUP 0< >R + DUP 0< IF R> IF R> ELSE R> DROP 0 THEN ELSE R> IF R> DROP -1 ELSE R> THEN THEN 32768 AND CE_SIM EXT@_SIM 32767 AND OR CE_SIM EXT!_SIM >PNTT_SIM ; : POP_SIM TMP_ASM INDEX_MOT_SIM @ + 80 OVER C! 1+ 79 OVER C! 1+ 80 SWAP C! 4 INDEX_MOT_SIM +! PNTR>_SIM >PNTT_SIM ; : POPA_SIM TMP_ASM INDEX_MOT_SIM @ + 80 OVER C! 1+ 79 OVER C! 1+ 80 OVER C! 1+ 65 SWAP C! 5 INDEX_MOT_SIM +! A_SIM 2@ >PNTT_SIM ; : DUP_SIM TMP_ASM INDEX_MOT_SIM @ + 68 OVER C! 1+ 85 OVER C! 1+ 80 SWAP C! 4 INDEX_MOT_SIM +! PNTT>_SIM DUP >PNTT_SIM >PNTT_SIM ; : OVER_SIM TMP_ASM INDEX_MOT_SIM @ + 79 OVER C! 1+ 86 OVER C! 1+ 69 OVER C! 1+ 82 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM PNTT>_SIM DUP >R >PNTT_SIM >PNTT_SIM R> >PNTT_SIM ; : PUSH_SIM TMP_ASM INDEX_MOT_SIM @ + 80 OVER C! 1+ 85 OVER C! 1+ 83 OVER C! 1+ 72 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM >PNTR_SIM ; : PUSHA_SIM TMP_ASM INDEX_MOT_SIM @ + 80 OVER C! 1+ 85 OVER C! 1+ 83 OVER C! 1+ 72 OVER C! 1+ 65 SWAP C! 6 INDEX_MOT_SIM +! PNTT>_SIM A_SIM 2! ; : NOP_SIM TMP_ASM INDEX_MOT_SIM @ + 78 OVER C! 1+ 79 OVER C! 1+ 80 SWAP C! 4 INDEX_MOT_SIM +! ; : DROP_SIM TMP_ASM INDEX_MOT_SIM @ + 68 OVER C! 1+ 82 OVER C! 1+ 79 OVER C! 1+ 80 SWAP C! 5 INDEX_MOT_SIM +! PNTT>_SIM DROP ; : INIT_SIM EXT_SIM 2048 0 FILL 0 A_SIM 2! 0 PC_SIM 2! 8192 DUP CE_SIM EXT!_SIM SCE_SIM EXT!_SIM ; : REG_SIM BASE @ HEX CR ." A C I M B S PC" CR 2 SPACES A_SIM 2@ 0 <# DROP SWAP # # # # # # # # #> TYPE 2 SPACES CE_SIM EXT@_SIM DUP -15 LSH 1 AND 48+ EMIT SPACE DUP -14 LSH 1 AND 48+ EMIT SPACE DUP -13 LSH 1 AND 48+ EMIT SPACE DUP -12 LSH 1 AND 48+ EMIT SPACE -11 LSH 1 AND 48+ EMIT 2 SPACES PC_SIM 2@ 0 <# DROP SWAP # # # # # # # # #> TYPE CR 2 SPACES SA_SIM EXT@_SIM 0 <# DROP SWAP # # # # # # # # #> TYPE 2 SPACES SCE_SIM EXT@_SIM DUP -15 LSH 1 AND 48+ EMIT SPACE DUP -14 LSH 1 AND 48+ EMIT SPACE DUP -13 LSH 1 AND 48+ EMIT SPACE DUP -12 LSH 1 AND 48+ EMIT SPACE -11 LSH 1 AND 48+ EMIT CR CR ." PNTT TOP SEC" CR PNTT_SIM EXT@_SIM DUP <# # # # # #> TYPE SPACE DUP 255 AND IF BEGIN 8 0 DO SPACE DUP EXT@_SIM 0 <# DROP SWAP # # # # # # # # #> TYPE 1+ DUP 255 AND 0= IF LEAVE THEN LOOP DUP 255 AND WHILE CR 5 SPACES REPEAT ELSE SPACE ." Pile des donnees vide !" THEN DROP CR CR ." PNTR R" CR PNTR_SIM EXT@_SIM DUP <# # # # # #> TYPE SPACE DUP 255 AND IF BEGIN 8 0 DO SPACE DUP EXT@_SIM 0 <# DROP SWAP # # # # # # # # #> TYPE 1+ DUP 255 AND 0= IF LEAVE THEN LOOP DUP 255 AND WHILE CR 5 SPACES REPEAT ELSE SPACE ." Pile de retour vide !" THEN DROP CR CR BASE ! ; : DECODE_SIM TMP_ASM DUP 256 32 FILL 0 ERREUR_CODE_SIM ! PC_SIM DUP >R 2@ DUP 2+ R> 2! DUP @ 65535 AND DUP BASE @ >R HEX <# # # # # 32 HOLD 32 HOLD 62 HOLD DROP ROT # # # # # # # # 60 HOLD 32 HOLD #> >R 3 PICK 1+ R> CMOVE R> BASE ! 19 INDEX_CODE_SIM ! 35 INDEX_MOT_SIM ! DUP 1 AND IF 65534 AND CALLA_SIM ELSE DUP -11 LSH 31 AND DUP 4 < IF ?DUP IF 1- ?DUP IF 1- IF JNC_SIM ELSE CALL_SIM THEN ELSE JZ_SIM THEN ELSE JMP_SIM THEN ELSE DROP 3 0 DO 5 LSH DUP SWAB 31 AND DUP 4 = IF FCW_SIM ELSE DUP 5 = IF STCW_SIM ELSE DUP 6 = IF RET_SIM LEAVE ELSE DUP 7 = IF IRET_SIM LEAVE ELSE DUP 8 = IF FTCHRP_SIM ELSE DUP 9 = IF FTCHAP_SIM ELSE DUP 10 = IF LIT_SIM ELSE DUP 11 = IF FTCHA_SIM ELSE DUP 12 = IF STRP_SIM ELSE DUP 13 = IF STAP_SIM ELSE DUP 14 = IF SWAB_SIM ELSE DUP 15 = IF STA_SIM ELSE DUP 16 = IF COM_SIM ELSE DUP 17 = IF ROLC_SIM ELSE DUP 18 = IF RORC_SIM ELSE DUP 19 = IF ADDC_SIM ELSE DUP 20 = IF XORR_SIM ELSE DUP 21 = IF ANDD_SIM ELSE DUP 22 = IF SXT_SIM ELSE DUP 23 = IF ADDD_SIM ELSE DUP 24 = IF POP_SIM ELSE DUP 25 = IF POPA_SIM ELSE DUP 26 = IF DUP_SIM ELSE DUP 27 = IF OVER_SIM ELSE DUP 28 = IF PUSH_SIM ELSE DUP 29 = IF PUSHA_SIM ELSE DUP 30 = IF NOP_SIM ELSE DUP 31 = IF DROP_SIM ELSE -1 ERREUR_CODE_SIM ! LEAVE THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN DROP LOOP DROP THEN THEN INDEX_MOT_SIM @ OVER C! COUNT TYPE CR ; : SAISIE_SIM ( valeur_initiale,nombre_de_chiffres,base --> valeur_saisie ) BASE @ >R BASE ! 1 MAX 0 BEGIN 0 <# SWAP DROP 4 PICK 4 PICK 0 DO # LOOP #> TYPE OVER OVER - 0 DO 8 EMIT LOOP KEY OVER ?DUP IF 0 DO 8 EMIT LOOP THEN DUP 13 = IF DROP -1 ELSE DUP 8 = OVER 28 = OR IF DROP DUP 0> IF 1- ELSE BELL THEN 0 ELSE DUP 9 = OVER 29 = OR OVER 32 = OR IF DROP OVER 1- OVER > IF 1+ ELSE BELL THEN 0 ELSE DUP 47 > OVER 58 < AND OVER 223 AND DUP 64 > SWAP 91 < AND OR IF DUP 58 < IF 48- ELSE 223 AND 65- 10+ THEN DUP BASE @ < IF 3 PICK 1- 3 PICK - ?DUP IF >R BASE @ R> 1- ?DUP IF 0 DO BASE @ U* LOOP THEN DUP >R U* 4 PICK R> U/MOD DROP + THEN 4 ROLL 3 PICK IF DUP 5 PICK 1- 5 PICK - >R BASE @ R> ?DUP IF 0 DO BASE @ U* LOOP THEN U/MOD DROP - + ELSE DROP THEN ROT ROT 1+ OVER MOD ELSE DROP BELL THEN ELSE DROP BELL THEN 0 THEN THEN THEN UNTIL 0 <# SWAP DROP 4 PICK 4 PICK 0 DO # LOOP #> TYPE DROP DROP R> BASE ! ; HEX : ALIGNE ( n --> (((n<<5)+n)<<5+n)<<1 ) DUP DUP 5 LSH + 5 LSH + 2* ; " 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 " RM" 0000 FIND INST_RM INS_ASM " CALLA" 0001 FIND INST_CALLA INS_ASM " JMP" 00 ALIGNE FIND INST_JMP INS_ASM " JZ" 01 ALIGNE FIND INST_JMP INS_ASM " CALL" 02 ALIGNE FIND INST_JMP INS_ASM " JNC" 03 ALIGNE FIND INST_JMP INS_ASM " FCW" 04 ALIGNE FIND INST_FCW INS_ASM " STCW" 05 ALIGNE FIND INST_FCW INS_ASM " RET" 06 ALIGNE FIND INST_RET INS_ASM " IRET" 07 ALIGNE FIND INST_RET INS_ASM " FTCHRP" 08 ALIGNE FIND INST_FCW INS_ASM " FTCHAP" 09 ALIGNE FIND INST_FCW INS_ASM " LIT" 0A ALIGNE FIND INST_LIT INS_ASM " FTCHA" 0B ALIGNE FIND INST_FCW INS_ASM " STRP" 0C ALIGNE FIND INST_FCW INS_ASM " STAP" 0D ALIGNE FIND INST_FCW INS_ASM " SWAB" 0E ALIGNE FIND INST_FCW INS_ASM " STA" 0F ALIGNE FIND INST_FCW INS_ASM " COM" 10 ALIGNE FIND INST_FCW INS_ASM " ROLC" 11 ALIGNE FIND INST_FCW INS_ASM " RORC" 12 ALIGNE FIND INST_FCW INS_ASM " ADDC" 13 ALIGNE FIND INST_FCW INS_ASM " XORR" 14 ALIGNE FIND INST_FCW INS_ASM " ANDD" 15 ALIGNE FIND INST_FCW INS_ASM " SXT" 16 ALIGNE FIND INST_FCW INS_ASM " ADDD" 17 ALIGNE FIND INST_FCW INS_ASM " POP" 18 ALIGNE FIND INST_FCW INS_ASM " POPA" 19 ALIGNE FIND INST_FCW INS_ASM " DUP" 1A ALIGNE FIND INST_FCW INS_ASM " OVER" 1B ALIGNE FIND INST_FCW INS_ASM " PUSH" 1C ALIGNE FIND INST_FCW INS_ASM " PUSHA" 1D ALIGNE FIND INST_FCW INS_ASM " NOP" 1E ALIGNE FIND INST_FCW INS_ASM " DROP" 1F ALIGNE FIND INST_FCW 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 ! HERE DUP HERE_ASM 2! DUP MEM_HERE_ASM 2! PNTIND_ASM 2! 1 TAILLE_CODE_ASM ! 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+ @ 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 ; : SIMULATION INIT_SIM BEGIN REG_SIM ." 1-Initialisation 2-Acces_registres 3-Acces_memoire 4-Pas 5-Executer 6-Fin " BEGIN KEY DUP 48 > OVER 55 < AND IF 48- -1 ELSE DROP BELL 0 THEN UNTIL CASE 1 OF ." Initialisation des registres (RESET)." INIT_SIM CR ." Programmation de l'adresse initiale : $" PC_SIM DUP >R 2@ 8 16 SAISIE_SIM R> 2! CR 0 ENDOF 2 OF BEGIN ." 1-Reg_actifs 2-Reg_sauvegardes 3-Pile_donnees 4-Pile_retour CR-Retour " BEGIN KEY DUP 48 > OVER 53 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF BEGIN ." 1-A 2-C 3-I 4-M 5-B 6-S 7-PC CR-Retour " BEGIN KEY DUP 48 > OVER 56 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF ." A = $" A_SIM DUP >R @ 8 16 SAISIE_SIM R> ! CR 0 ENDOF 2 OF ." C = %" CE_SIM DUP >R EXT@_SIM DUP 32767 AND >R -15 LSH 1 AND 1 2 SAISIE_SIM 15 LSH R> OR R> EXT!_SIM CR 0 ENDOF 3 OF ." I = %" CE_SIM DUP >R EXT@_SIM DUP 49151 AND >R -14 LSH 1 AND 1 2 SAISIE_SIM 14 LSH R> OR R> EXT!_SIM CR 0 ENDOF 4 OF ." M = %" CE_SIM DUP >R EXT@_SIM DUP 57343 AND >R -13 LSH 1 AND 1 2 SAISIE_SIM 13 LSH R> OR R> EXT!_SIM CR 0 ENDOF 5 OF ." B = %" CE_SIM DUP >R EXT@_SIM DUP 61439 AND >R -12 LSH 1 AND 1 2 SAISIE_SIM 12 LSH R> OR R> EXT!_SIM CR 0 ENDOF 6 OF ." S = %" CE_SIM DUP >R EXT@_SIM DUP 63487 AND >R -11 LSH 1 AND 1 2 SAISIE_SIM 11 LSH R> OR R> EXT!_SIM CR 0 ENDOF 7 OF ." PC = $" PC_SIM DUP >R 2@ 8 16 SAISIE_SIM R> 2! CR 0 ENDOF -1 ENDCASE UNTIL 0 ENDOF 2 OF BEGIN ." 1-SVA 2-SVC 3-SVI 4-SVM 5-SVB 6-SVS CR-Retour " BEGIN KEY DUP 48 > OVER 55 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF ." SVA = $" SA_SIM DUP >R EXT@_SIM 8 16 SAISIE_SIM R> EXT!_SIM CR 0 ENDOF 2 OF ." SVC = %" SCE_SIM DUP >R EXT@_SIM DUP 32767 AND >R -15 LSH 1 AND 1 2 SAISIE_SIM 15 LSH R> OR R> EXT!_SIM CR 0 ENDOF 3 OF ." SVI = %" SCE_SIM DUP >R EXT@_SIM DUP 49151 AND >R -14 LSH 1 AND 1 2 SAISIE_SIM 14 LSH R> OR R> EXT!_SIM CR 0 ENDOF 4 OF ." SVM = %" SCE_SIM DUP >R EXT@_SIM DUP 57343 AND >R -13 LSH 1 AND 1 2 SAISIE_SIM 13 LSH R> OR R> EXT!_SIM CR 0 ENDOF 5 OF ." SVB = %" SCE_SIM DUP >R EXT@_SIM DUP 61439 AND >R -12 LSH 1 AND 1 2 SAISIE_SIM 12 LSH R> OR R> EXT!_SIM CR 0 ENDOF 6 OF ." SVS = %" SCE_SIM DUP >R EXT@_SIM DUP 63487 AND >R -11 LSH 1 AND 1 2 SAISIE_SIM 11 LSH R> OR R> EXT!_SIM CR 0 ENDOF -1 ENDCASE UNTIL 0 ENDOF 3 OF ." 1-Inserer/dupliquer_une_donnee 2-Etraire_une_donnee CR-Retour " BEGIN KEY DUP 48 > OVER 51 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF ." Donnee inseree : $" PNTT>_SIM DUP >PNTT_SIM 8 16 SAISIE_SIM >PNTT_SIM CR -1 ENDOF 2 OF PNTT>_SIM DROP -1 ENDOF 0 ENDCASE ENDOF 4 OF ." 1-Inserer/dupliquer_une_adresse 2-Etraire_une_adresse CR-Retour " BEGIN KEY DUP 48 > OVER 51 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF ." Adresse inseree : $" PNTR>_SIM DUP >PNTR_SIM 8 16 SAISIE_SIM >PNTR_SIM CR -1 ENDOF 2 OF PNTR>_SIM DROP -1 ENDOF 0 ENDCASE ENDOF -1 ENDCASE UNTIL 0 ENDOF 3 OF ." 1-Reg_extension 2-Mem_centrale(8b) 3-Mem_centrale(16b) CR-Retour " BEGIN KEY DUP 48 > OVER 52 < AND IF 48- -1 ELSE 13 = IF -1 DUP ELSE BELL 0 THEN THEN UNTIL CASE 1 OF NUMERO_SIM DUP >R @ 2 SPACES 1 BEGIN ." Numero : $" IF 4 16 SAISIE_SIM ELSE BASE @ HEX 0 <# SWAP DROP 3 PICK # # # # #> TYPE BASE ! THEN DUP EXT@_SIM ." Valeur : $" 4 16 SAISIE_SIM OVER EXT!_SIM 8 EMIT 8 EMIT 8 EMIT 8 EMIT DUP EXT@_SIM BASE @ >R HEX <# # # # # #> TYPE R> BASE ! CR BEGIN ." + - CR ESCAPE ?" KEY 15 0 DO 8 EMIT SPACE 8 EMIT LOOP CASE 43 OF 1+ 0 DUP -1 ENDOF 45 OF 1- 0 DUP -1 ENDOF 13 OF 1 0 -1 ENDOF 27 OF -1 -1 ENDOF BELL 0 ENDCASE UNTIL UNTIL R> ! ENDOF 2 OF ADRESSE_SIM DUP >R 2@ 2 SPACES 1 BEGIN ." Adresse : $" IF 8 16 SAISIE_SIM ELSE BASE @ HEX 0 <# SWAP DROP 3 PICK # # # # # # # # #> TYPE BASE ! THEN DUP C@ ." Donnee : $" 2 16 SAISIE_SIM OVER C! CR BEGIN ." + - CR ESCAPE ?" KEY 15 0 DO 8 EMIT SPACE 8 EMIT LOOP CASE 43 OF 1+ 0 DUP -1 ENDOF 45 OF 1- 0 DUP -1 ENDOF 13 OF 1 0 -1 ENDOF 27 OF -1 -1 ENDOF BELL 0 ENDCASE UNTIL UNTIL R> 2! ENDOF 3 OF ADRESSE_SIM DUP >R 2@ 2 SPACES 1 BEGIN ." Adresse : $" IF 8 16 SAISIE_SIM ELSE BASE @ HEX 0 <# SWAP DROP 3 PICK # # # # # # # # #> TYPE BASE ! THEN DUP -2 AND @ 8 EMIT OVER 14 AND 48+ DUP 57 > 7 AND + EMIT ." Donnee : $" 4 16 SAISIE_SIM OVER -2 AND ! CR BEGIN ." + - CR ESCAPE ?" KEY 15 0 DO 8 EMIT SPACE 8 EMIT LOOP CASE 43 OF 2+ 0 DUP -1 ENDOF 45 OF 2- 0 DUP -1 ENDOF 13 OF 1 0 -1 ENDOF 27 OF -1 -1 ENDOF BELL 0 ENDCASE UNTIL UNTIL R> 2! ENDOF ENDCASE 0 ENDOF 4 OF ." Execution d'une ligne de programme." CR DECODE_SIM ERREUR_CODE_SIM @ IF ." **** Instruction NON DECODABLE !" BELL CR THEN 0 ENDOF 5 OF ." Execution de plusieurs lignes de programme jusqu'a l'adresse : $" PC_SIM 2@ DUP @ DUP 1 AND ( instruction CALLA ) IF DROP 4+ ELSE DUP 49152 AND IF 2/ 3 0 DO DUP 31 AND 10 = ( instruction LIT ) IF >R 2+ R> THEN -5 LSH LOOP THEN DROP 2+ THEN 8 16 SAISIE_SIM CR ." Taper sur une touche du clavier pour interrompre la simulation." CR BEGIN DECODE_SIM ERREUR_CODE_SIM @ IF ." **** Instruction NON DECODABLE !" BELL CR -1 ELSE DUP PC_SIM 2@ = IF -1 ELSE KEYBOARD IF KEY DROP -1 ELSE 0 THEN THEN THEN UNTIL DROP 0 ENDOF ." Fin de la simulation." CR -1 ENDCASE 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 ; 0 INIT_ASM ! ANCIEN_HERE >HERE DICO_INIT ( FIN )