Quantum Forth Z80 (versión 0)

Descripción del contenido de la página

Ensamblador del microprocesador Z80, escrito en Forth para QL.

Etiquetas:

Esta primera versión usa un enfoque muy simplista: crear una palabra por cada combinación posible de instrucción y registros, para intentar que el código en Z80 se parezca al de un ensamblador estándar.

Código fuente

El fichero original de 1988 estaba escrito para Computer One Forth, en formato de fichero de bloques de Forth, y con la codificación de caracteres de QL. Para facilitar su publicación y reutilización, lo convertí en un fichero de texto de formato estándar y codificado con UTF-8.
\ QUANTUM FORTH Z80 v0

\ Copyright (C) 1988 Marcos Cruz (programandala.net)
\ Licencia/Permesilo/License:
\ http://programandala.net/license

\ http://programandala.net/es.programa.quantum_forth_z80.html

\ 1988: Escrito para el Forth de Computer One de Sinclair QL.
\ 2015-03-13: Convertido del formato de bloques original a fichero
\ estándar. Textos y comentarios corregidos. Pequeños cambios de
\ formato.

\ ..............................................................
\ Ejemplo de ensamblador

\        *L+
\  " QL" DEFM
\        DI
\        NOP
\        DI
\        RST_10
\        EI
\        RET
\        END

\ ..............................................................
\ Pruebas

: MARGEN ." Z80 Assembler   " .DATE .TIME ;
: LLIST ( P1,P2--)
  1+ SWAP
  PRINTER
  MARGEN
  CR
  DO I LIST LOOP
  CR
  MARGEN
  CR
  CONSOLE
  ;

\ ..............................................................
\ Palabras auxiliares

: TASK ;
: DEPTH2/ DEPTH 2 / ;
: VACIA_PILA S0 @ SP! ;
: NUMERO BL WORD NUMBER ;
: NUM NUMERO DROP DECIMAL ;
: TEXTO->PILA DUP COUNT ROT + DO I C@ -1 +LOOP ;
: GIRA_PILA PAD DEPTH2/ 1- 2DUP SWAP C! OVER + SWAP 1+ SWAP
  DO I C! -1 +LOOP PAD TEXTO->PILA ;
: BANDERA CREATE 1 ALLOT DOES> ;
: PON-BANDERA SWAP C! ;
: SI 1 PON-BANDERA ;
: NO 0 PON-BANDERA ;

\ ..............................................................
\ Variables y constantes

VARIABLE DIR_ZX \ dirección del código objeto en Spectrum
NUMERO 983040 2CONSTANT DIR0_QL \ dirección base del espacio libre del QL
BANDERA PASADA \ indicador de pasada que se está efectuando 0/1
BANDERA EQU? \ bandera indicadora de EQU
BANDERA LISTADO \ bandera de salida de listado
BANDERA DEC \ bandera de salida de direcciones en decimal

: PASADA0? PASADA C@ 0= ;
: LISTADO? LISTADO C@ ;

\ ..............................................................
\ Etiquetas

: ETIQUETA
  CREATE ,
  DOES>  EQU? @ IF 0 EQU? !  ELSE @ ENDIF
  ;

\ ..............................................................
\ Direcciones objeto

: DIR_QL DIR0_QL DIR_ZX @ 0 D+ ;

: .DIR_ZX DIR_ZX @ DEC C@ IF DECIMAL ENDIF . HEX SPACE ;

: .G LISTADO? IF DUP . ENDIF  DIR_QL ;

: G,, .G !L 2 DIR_ZX +! ;

: G, .G C!L 1 DIR_ZX +! ;

\ ..............................................................
\ Comprueba

: COMPRUEBA
  2DUP +
  DEPTH2/ 3 - 2DUP
  > 33 ?ERROR
  < 34 ?ERROR
  2 * + DIR_ZX +!
  ;

\ ..............................................................
\ Guarda

: GUARDA
  LISTADO? IF .DIR_ZX ENDIF
  SWAP >R
  DUP
  IF 0 DO G,, LOOP
  ELSE DROP
  ENDIF
  R>
  DUP
  IF 0 DO G, LOOP
  ENDIF
  LISTADO? IF CR ENDIF
  ;

\ ..............................................................
\ Opcode

: OPCODE
  PASADA0?
  IF
    COMPRUEBA
  ELSE
    GUARDA
  ENDIF
  VACIA_PILA
  ;
: 20O 2 0 OPCODE ;
: 21O 2 1 OPCODE ;
: 30O 3 0 OPCODE ;
: 40O 4 0 OPCODE ;

\ ..............................................................
\ Control de ficheros

FCB PRIM-FCB
: ABRE-FICHERO OPEN-SCR IF
  CR ." No se encuentra " .SCREEN-FILE
  PREV-FCB NAME-LENGTH 1+ OPEN-SCR DROP QUIT
  ENDIF ;
: SALVA-EN ( fcbdir--) SCREEN-FCB SWAP 64 CMOVE ;
: RECUPERA ( fcbdir--) SCREEN-FCB 64 CMOVE ;
: NUEVO-FICHERO PREV SALVA-EN SAVE-BUFFERS
  CLOSE-SCR EMPTY-BUFFERS SCREEN-FCB BL WORD ABRE-FICHERO ;
\ : COMPILA 1 LOAD LOAD ; \ obsoleto

\ ..............................................................
\ Pseudonemónicos y comandos

: $ DIR_ZX @ ;
: ORG DUP $ - DUP 0< 38 ?ERROR DIR_ZX +! ;
: IDEFB DEPTH2/ 0 OPCODE ;
: IDEFW DEPTH2/ 0 SWAP OPCODE ;
: DEFS DIR_ZX +! ;
: DEFB GIRA_PILA IDEFB ;
: DEFW GIRA_PILA IDEFW ;
: DEFM IDEFB ;
: " 34 WORD TEXTO->PILA ;
: EQU PASADA0? IF ETIQUETA ELSE 1 EQU? ! DROP ENDIF ;
: ? PASADA0? IF BL WORD ENDIF ; ( precede a las etiquetas)
: % BINARY NUM ;
: # HEX NUM ;
: *S BEGIN ?TERMINAL UNTIL ;
: *E CR CR CR ;
: *H *E 34 WORD COUNT TYPE ;
: *L+ LISTADO SI ;
: *L- LISTADO NO ;
: *F NUEVO-FICHERO COMPILA ;
: *D+ DEC NO ;
: *D- DEC SI ;
: ES-PASADA PASADA C! ;
: END
  PASADA0? IF
  ." Pasada 0" 1 ES-PASADA CR PRIM-FCB RECUPERA
  0 DIR_ZX ! COMPILA
  ENDIF
  ." Pasada 1" PRIM-FCB RECUPERA CR CONSOLE DECIMAL QUIT ;

\ ..............................................................
\ Ensambla

: ENSAMBLA
  PRIM-FCB SALVA-EN
  0 DIR_ZX !
  0 ES-PASADA
  *F
  ;

\ ..............................................................
\ Nemónicos primarios

: OO 1 0 OPCODE ;
: OOXX 20O ;
: JRXX
  SWAP $ 2+ -
  DUP 127 > 36 ?ERROR
  DUP -128 < 37 ?ERROR
  OOXX
  ;
: OOXXXX 1 1 OPCODE ;

: CBOO 203 20O ;

: DDOO 221 20O ;
: DDOOXX 221 30O ;
: DDCBXXOO SWAP 203 221 40O ;
: DDOOXXXX 221 21O ;

: FDOO 253 20O ;
: FDOOXX 253 30O ;
: FDCBXXOO SWAP 203 253 40O ;
: FDOOXXXX 253 21O ;

: EDOO 237 20O ;
: EDOOXXXX 237 21O ;

\ ..............................................................
\ Nemónicos OO

HEX
: NOP 0 OO ;
: LD(BC),A 2 OO ;
: INC_BC 3 OO ;
: INC_B 4 OO ;
: DEC_B OO ;
: RLCA 7 OO ;
: EX_AF,AF 8 OO ;
: ADD_HL,BC 9 OO ;
: LD_A,(BC) A OO ;
: DEC_BC B OO ;
: INC_C C OO ;
: DEC_C D OO ;
: RRCA F OO ;
: LD(DE),A 12 OO ;
: INC_DE 13 OO ;
: INC_D 14 OO ;
: DEC_D 15 OO ;
: RLA 17 OO ;
: ADD_HL,DE 19 OO ;
: LD_A,(DE) 1A OO ;
: DEC_DE 1B OO ;
: INC_E 1C OO ;
: DEC_E 1D OO ;
: RRA 1F OO ;
: INC_HL 23 OO ;
: INC_H 24 OO ;
: DEC_H 25 OO ;
: DAA 27 OO ;
: ADD_HL,HL 29 OO ;
: DEC_HL 2B OO ;
: INC_L 2C OO ;
: DEC_L 2D OO ;
: CPL 2F OO ;
: INC_SP 33 OO ;
: INC(HL) 34 OO ;
: DEC(HL) 35 OO ;
: SCF 37 OO ;
: ADD_HL,SP 39 OO ;
: DEC_SP 3B OO ;
: INC_A 3C OO ;
: DEC_A 3D OO ;
: CCF 3F OO ;
: LD_B,B 40 OO ;
: LD_B,C 41 OO ;
: LD_B,D 42 OO ;
: LD_B,E 43 OO ;
: LD_B,H 44 OO ;
: LD_B,L 45 OO ;
: LD_B,(HL) 46 OO ;
: LD_B,A 47 OO ;
: LD_C,B 48 OO ;
: LD_C,C 49 OO ;
: LD_C,D 4A OO ;
: LD_C,E 4B OO ;
: LD_C,H 4C OO ;
: LD_C,L 4D OO ;
: LD_C,(HL) 4E OO ;
: LD_C,A 4F OO ;
: LD_D,B 50 OO ;
: LD_D,C 51 OO ;
: LD_D,D 52 OO ;
: LD_D,E 53 OO ;
: LD_D,H 54 OO ;
: LD_D,L 55 OO ;
: LD_D,(HL) 56 OO ;
: LD_D,A 57 OO ;
: LD_E,B 58 OO ;
: LD_E,C 59 OO ;
: LD_E,D 5A OO ;
: LD_E,E 5B OO ;
: LD_E,H 5C OO ;
: LD_E,L 5D OO ;
: LD_E,(HL) 5E OO ;
: LD_E,A 5F OO ;
: LD_H,B 60 OO ;
: LD_H,C 61 OO ;
: LD_H,D 62 OO ;
: LD_H,E 63 OO ;
: LD_H,H 64 OO ;
: LD_H,L 65 OO ;
: LD_H,(HL) 66 OO ;
: LD_H,A 67 OO ;
: LD_L,B 68 OO ;
: LD_L,C 69 OO ;
: LD_L,D 6A OO ;
: LD_L,E 6B OO ;
: LD_L,H 6C OO ;
: LD_L,L 6D OO ;
: LD_L,(HL) 6E OO ;
: LD_L,A 6F OO ;
: LD(HL),B 70 OO ;
: LD(HL),C 71 OO ;
: LD(HL),D 72 OO ;
: LD(HL),E 73 OO ;
: LD(HL),H 74 OO ;
: LD(HL),L 75 OO ;
: HALT 76 OO ;
: LD(HL),A 77 OO ;
: LD_A,B 78 OO ;
: LD_A,C 79 OO ;
: LD_A,D 7A OO ;
: LD_A,E 7B OO ;
: LD_A,H 7C OO ;
: LD_A,L 7D OO ;
: LD_A,(HL) 7E OO ;
: LD_A,A 7F OO ;
: ADD_A,B 80 OO ;
: ADD_A,C 81 OO ;
: ADD_A,D 82 OO ;
: ADD_A,E 83 OO ;
: ADD_A,H 84 OO ;
: ADD_A,L 85 OO ;
: ADD_A,(HL) 86 OO ;
: ADD_A,A 87 OO ;
: ADC_A,B 88 OO ;
: ADC_A,C 89 OO ;
: ADC_A,D 8A OO ;
: ADC_A,E 8B OO ;
: ADC_A,H 8C OO ;
: ADC_A,L 8D OO ;
: ADC_A,(HL) 8E OO ;
: ADC_A,A 8F OO ;
: SUB_B 90 OO ;
: SUB_C 91 OO ;
: SUB_D 92 OO ;
: SUB_E 93 OO ;
: SUB_H 94 OO ;
: SUB_L 95 OO ;
: SUB(HL) 96 OO ;
: SUB_A 97 OO ;
: SBC_A,B 98 OO ;
: SBC_A,C 99 OO ;
: SBC_A,D 9A OO ;
: SBC_A,E 9B OO ;
: SBC_A,H 9C OO ;
: SBC_A,L 9D OO ;
: SBC_A,(HL) 9E OO ;
: SBC_A,A 9F OO ;
: AND_B A0 OO ;
: AND_C A1 OO ;
: AND_D A2 OO ;
: AND_E A3 OO ;
: AND_H A4 OO ;
: AND_L A5 OO ;
: AND(HL) A6 OO ;
: AND_A A7 OO ;
: XOR_B A8 OO ;
: XOR_C A9 OO ;
: XOR_D AA OO ;
: XOR_E AB OO ;
: XOR_H AC OO ;
: XOR_L AD OO ;
: XOR(HL) AE OO ;
: XOR_A AF OO ;
: OR_B B0 OO ;
: OR_C B1 OO ;
: OR_D B2 OO ;
: OR_E B3 OO ;
: OR_H B4 OO ;
: OR_L B5 OO ;
: OR(HL) B6 OO ;
: OR_A B7 OO ;
: CP_B B8 OO ;
: CP_C B9 OO ;
: CP_D BA OO ;
: CP_E BB OO ;
: CP_H BC OO ;
: CP_L BD OO ;
: CP(HL) BE OO ;
: CP_A BF OO ;
: RET_NZ C0 OO ;
: POP_BC C1 OO ;
: PUSH_BC C5 OO ;
: RST_00 C7 OO ;
: RET_Z C8 OO ;
: RET C9 OO ;
: RST_08 CF OO ;
: RET_NC D0 OO ;
: POP_DE D1 OO ;
: PUSH_DE D5 OO ;
: RST_10 D7 OO ;
: RET_C D8 OO ;
: EXX D9 OO ;
: RST_18 DF OO ;
: RET_PO E0 OO ;
: POP_HL E1 OO ;
: EX(SP),HL E3 OO ;
: PUSH_HL E5 OO ;
: RST_20 E7 OO ;
: RET_PE E8 OO ;
: JP(HL) E9 OO ;
: EX_DE,HL EB OO ;
: RST_28 EF OO ;
: RET_P F0 OO ;
: POP_AF F1 OO ;
: DI F3 OO ;
: PUSH_AF F5 OO ;
: RST_30 F7 OO ;
: RET_N F8 OO ;
: LD_SP,HL F9 OO ;
: EI FB OO ;
: RST_38 FF OO ;

\ ..............................................................
\ Nemónicos OOXX

: LD_B, 6 OOXX ;
: LD_C, E OOXX ;
: DJNZ 10 JRXX ;
: LD_D, 16 OOXX ;
: JR 18 JRXX ;
: LD_E, 1E OOXX ;
: JR_NZ, 20 JRXX ;
: LD_H, 26 OOXX ;
: JR_Z, 28 OOXX ;
: LD_L, 2E OOXX ;
: JR_NC, 30 OOXX ;
: LD(HL), 36 OOXX ;
: JR_C, 38 OOXX ;
: LD_A, 3E OOXX ;
: ADD_A, C6 OOXX ;
: ADC_A, CE OOXX ;
: OUT(),A D3 OOXX ;
: SUB D6 OOXX ;
: IN_A,() DB OOXX ;
: SBC_A, DE OOXX ;
: AND E6 OOXX ;
: XOR EE OOXX ;
: OR F6 OOXX ;
: CP FE OOXX ;

\ ..............................................................
\ Nemónicos OOXXXX

: LD_BC, 1 OOXXXX ;
: LD_DE, 11 OOXXXX ;
: LD_HL, 21 OOXXXX ;
: LD(),HL 22 OOXXXX ;
: LD_HL,() 2A OOXXXX ;
: LD_SP, 31 OOXXXX ;
: LD(),A 32 OOXXXX ;
: LD_A,() 3A OOXXXX ;
: JP_NZ, C2 OOXXXX ;
: JP C3 OOXXXX ;
: CALL_NZ, C4 OOXXXX ;
: JP_Z, CA OOXXXX ;
: CALL_Z, CC OOXXXX ;
: CALL CD OOXXXX ;
: JP_NC, D2 OOXXXX ;
: CALL_NC, D4 OOXXXX ;
: JP_C, DA OOXXXX ;
: CALL_C, DC OOXXXX ;
: JP_PO, E2 OOXXXX ;
: CALL_PO, E4 OOXXXX ;
: JP_PE, EA OOXXXX ;
: CALL_PE, EC OOXXXX ;
: JP_P, F2 OOXXXX ;
: CALL_P, F4 OOXXXX ;
: JP_M, FA OOXXXX ;
: CALL_M, FC OOXXXX ;

\ ..............................................................
\ Nemónicos CBOO

: RLC_B 0 CBOO ;
: RLC_C 1 CBOO ;
: RLC_D 2 CBOO ;
: RLC_E 3 CBOO ;
: RLC_H 4 CBOO ;
: RLC_L 5 CBOO ;
: RLC(HL) 6 CBOO ;
: RLC_A 7 CBOO ;
: RRC_B 8 CBOO ;
: RRC_C 9 CBOO ;
: RRC_D A CBOO ;
: RRC_E B CBOO ;
: RRC_H C CBOO ;
: RRC_L D CBOO ;
: RRC(HL) E CBOO ;
: RRC_A F CBOO ;
: RL_B 10 CBOO ;
: RL_C 11 CBOO ;
: RL_D 12 CBOO ;
: RL_E 13 CBOO ;
: RL_H 14 CBOO ;
: RL_L 15 CBOO ;
: RL(HL) 16 CBOO ;
: RL_A 17 CBOO ;
: RR_B 18 CBOO ;
: RR_C 19 CBOO ;
: RR_D 1A CBOO ;
: RR_E 1B CBOO ;
: RR_H 1C CBOO ;
: RR_L 1D CBOO ;
: RR(HL) 1E CBOO ;
: RR_A 1F CBOO ;
: SLA_B 20 CBOO ;
: SLA_C 21 CBOO ;
: SLA_D 22 CBOO ;
: SLA_E 23 CBOO ;
: SLA_H 24 CBOO ;
: SLA_L 25 CBOO ;
: SLA(HL) 26 CBOO ;
: SLA_A 27 CBOO ;
: SRA_B 28 CBOO ;
: SRA_C 29 CBOO ;
: SRA_D 2A CBOO ;
: SRA_E 2B CBOO ;
: SRA_H 2C CBOO ;
: SRA_H 2C CBOO ;
: SRA_L 2D CBOO ;
: SRA(HL) 2E CBOO ;
: SRA_A 2F CBOO ;
: SRL_B 38 CBOO ;
: SRL_C 39 CBOO ;
: SRL_D 3A CBOO ;
: SRL_E 3B CBOO ;
: SRL_H 3C CBOO ;
: SRL_L 3D CBOO ;
: SRL(HL) 3E CBOO ;
: SRL_A 3F CBOO ;
: BIT0,B 40 CBOO ;
: BIT0,C 41 CBOO ;
: BIT0,D 42 CBOO ;
: BIT0,E 43 CBOO ;
: BIT0,H 44 CBOO ;
: BIT0,L 45 CBOO ;
: BIT0,(HL) 46 CBOO ;
: BIT0,A 47 CBOO ;
: BIT1,B 48 CBOO ;
: BIT1,C 49 CBOO ;
: BIT1,D 4A CBOO ;
: BIT1,E 4B CBOO ;
: BIT1,H 4C CBOO ;
: BIT1,L 4D CBOO ;
: BIT1,(HL) 4E CBOO ;
: BIT1,A 4F CBOO ;
: BIT2,B 50 CBOO ;
: BIT2,C 51 CBOO ;
: BIT2,D 52 CBOO ;
: BIT2,E 53 CBOO ;
: BIT2,H 54 CBOO ;
: BIT2,L 55 CBOO ;
: BIT2,(HL) 56 CBOO ;
: BIT2,A 57 CBOO ;
: BIT3,B 58 CBOO ;
: BIT3,C 5A CBOO ;
: BIT3,D 5B CBOO ;
: BIT3,E 5C CBOO ;
: BIT3,H 5D CBOO ;
: BIT4,L 5E CBOO ;
: BIT4,(HL) 5F CBOO ;
: BIT4,A 60 CBOO ;
: BIT5,B 61 CBOO ;
: BIT5,D 61 CBOO ;
: BIT5,E 62 CBOO ;
: BIT6,H 63 CBOO ;
: BIT6,L 64 CBOO ;
: BIT6,(HL) 65 CBOO ;
: BIT6,A 66 CBOO ;
: BIT7,B 67 CBOO ;
: BIT7,C 68 CBOO ;
: BIT7,D 69 CBOO ;
: BIT7,E 6A CBOO ;
: BIT7,H 6B CBOO ;
: BIT7,L 6C CBOO ;
: BIT7,(HL) 6D CBOO ;
: BIT7,A 6E CBOO ;
: RES0,B 80 CBOO ;
: RES0,C 81 CBOO ;
: RES0,D 82 CBOO ;
: RES0,E 83 CBOO ;
: RES0,H 84 CBOO ;
: RES0,L 85 CBOO ;
: RES0,(HL) 86 CBOO ;
: RES0,A 87 CBOO ;
: RES1,B 88 CBOO ;
: RES1,C 89 CBOO ;
: RES1,D 8A CBOO ;
: RES1,H 8B CBOO ;
: RES1,L 8C CBOO ;
: RES1,(HL) 8D CBOO ;
: RES1,A 8E CBOO ;
: RES2,B 8F CBOO ;
: RES2,C 90 CBOO ;
: RES2,D 91 CBOO ;
: RES2,E 92 CBOO ;
: RES2,H 93 CBOO ;
: RES2,L 94 CBOO ;
: RES2,(HL) 95 CBOO ;
: RES2,A 96 CBOO ;
: RES3,B 97 CBOO ;
: RES3,C 98 CBOO ;
: RES3,D 99 CBOO ;
: RES3,E 9A CBOO ;
: RES3,H 9B CBOO ;
: RES4,L 9C CBOO ;
: RES4,(HL) 9D CBOO ;
: RES4,A 9E CBOO ;
: RES5,B 9F CBOO ;
: RES5,C A0 CBOO ;
: RES5,D A1 CBOO ;
: RES5,E A2 CBOO ;
: RES6,H A3 CBOO ;
: RES6,L A4 CBOO ;
: RES6,(HL) A5 CBOO ;
: RES6,A A6 CBOO ;
: RES7,B A7 CBOO ;
: RES7,C A8 CBOO ;
: RES7,D A9 CBOO ;
: RES7,E AA CBOO ;
: RES7,H AB CBOO ;
: RES7,L AC CBOO ;
: RES7,(HL) AD CBOO ;
: RES7,A AE CBOO ;
: SET0,B 80 CBOO ;
: RES0,C 81 CBOO ;
: RES0,D 82 CBOO ;
: RES0,E 83 CBOO ;
: RES0,H 84 CBOO ;
: RES0,L 85 CBOO ;
: RES0,(HL) 86 CBOO ;
: RES0,A 87 CBOO ;
: RES1,B 88 CBOO ;
: RES1,C 89 CBOO ;
: RES1,D 8A CBOO ;
: RES1,H 8B CBOO ;
: RES1,L 8C CBOO ;
: RES1,(HL) 8D CBOO ;
: RES1,A 8E CBOO ;
: RES2,B 8F CBOO ;
: RES2,C 90 CBOO ;
: RES2,D 91 CBOO ;
: RES2,E 92 CBOO ;
: RES2,H 93 CBOO ;
: RES2,L 94 CBOO ;
: RES2,(HL) 95 CBOO ;
: RES2,A 96 CBOO ;
: RES3,B 97 CBOO ;
: RES3,C 98 CBOO ;
: RES3,D 99 CBOO ;
: RES3,E 9A CBOO ;
: RES3,H 9B CBOO ;
: RES4,L 9C CBOO ;
: RES4,(HL) 9D CBOO ;
: RES4,A 9E CBOO ;
: RES5,B 9F CBOO ;
: RES5,D A1 CBOO ;
: RES5,E A2 CBOO ;
: RES6,H A3 CBOO ;
: RES6,L A4 CBOO ;
: RES6,(HL) A5 CBOO ;
: RES6,A A6 CBOO ;
: RES7,B A7 CBOO ;
: RES7,C A8 CBOO ;
: RES7,D A9 CBOO ;
: RES7,E AA CBOO ;
: RES7,H AB CBOO ;
: RES7,L AC CBOO ;
: RES7,(HL) AD CBOO ;
: RES7,A AE CBOO ;

Descarga

Todas las versiones del programa pueden descargarse desde la sección de descargas de su página principal.