Vistas de página en total

Programar en android TRS-80 y ensamblador Z80 -2

VER VIDEO PZ2
En el blog anterior vimos el programa PZ1 para hacer una simple suma y resta con mensajes desplegamos los resultados ahora completaremos el programa PZ2 con introducir los datos por el teclado de la pantalla.

1.Ejecutamos TRS-80 y aparecen 4 modelos y seleccionamos el último TRS80 III con NEWDOS80 presionamos el menu izquierdo y presionamos START o RESUME y aparece una pantalla del sistema operativo NEWDOS80 con el mensaje NewDos/80 Ready está listo para recibir comandos del sistema operativo. Hay varios comandos como:
FREE indica la cantidad de espacio libre en granules, cada granulo equivale a dos sectores de 256 bytes.
Drive0  NEWDOS80  06/00/00  40 tracks  13 Fdes  51 Grans
Tiene 40 tracks con 51 Gránulos  libres en el Drive 0
LIST archivo Despliega el contenido de un archivo de texto.
KILL archivo Elimina un archivo almacenado en el disco.
RENAME Cambia el nombre de un archivo.
COPY archivo1 archivo2 Copia el archivo1 a un nuevo archivo2 en el disco.
DIR Despliega el directorio de todos los archivos almacenados en el disco.
Ahora  introducimos DIR y aparece el directorio de programas y archivos SRC o ASM y CMD. Vemos el programa EDTASM/CMD es el editor y ensamblador que utilizaremos.
2.Introducimos EDTASM y aparece la pantalla del editor ensamblador TRS-80 EDITOR/ASSEMBLER 1.1 y un * asterisco. Si ya tenemos el programa en disco lo cargamos en memoria con L D=PZ2/SRC o ASM y aparece el mensaje APPARAT ASSEMBLER APPENDAGE, VERSION 3 y * asterisco, listo para recibir comandos. Hay varios comandos como Pnl1:nl2 para desplegar líneas, Dnl1:nl2 de eliminar líneas y se aplican a una sola línea o a un rango de líneas, el carácter # indica el inicio y * el final, es oportuno indicar que con la tecla SHIFT aparecen más caracteres como # * / y otros. con P#:* desplegara todas las líneas. Rnl para reemplazar una línea. Enl para editar una línea una vez introducido acepta subcomandos como X para desplegar la línea y el cursor aparece al final y se puede retroceder con <- para corregir la línea. Inl para insertar líneas a partir de una línea y se va incrementando en 10. Para introducir el programa usamos I insert y aparece la primera línea con 100 ahora línea por línea introducimos el programa y se va incrementando en 10. Como ejemplo cuando aparece 100 presionamos el tabulador -> y salta 8 posiciones escribimos ORG volvemos  a presionar -> salta 8 posiciones y escribimos 7000H y ahora presionamos ENTER  y aparece la siguiente línea de 110 así continuamos introduciendo todas las líneas hasta la última línea  ponemos END.
El lenguaje ensamblador del Z80 tiene un formato para las instrucciones, como una línea de texto siguiente.
ETIQUETA  CODIGO DE OPERACION   OPERANDOS  ;COMENTARIOS
ETIQUETA Indica una dirección a una instrucción y se usa para de alguna parte del programa de regresar a esta dirección.
CODIGO DE OPERACION Cada instrucción tiene un código para las operaciones de trasferencia, aritmética, lógicas, desplazamiento, rotación, saltos incondicionales y condicionales, llamadas de subrutinas, entrada y salida de dispositivos periféricos y de control.
OPERANDOS o DATOS Cada instrución tiene un código de operación y sus correspondientes operandos o datos para ejecutar la instrucción.
COMENTARIOS Sirven para comentar la instrucción con una descripción sencilla y corta iniciando con ; punto y coma. Cuando es larga se utiliza toda la línea iniciando con ; punto y coma y todo el comentario.
Instrucciones del lenguaje ensamblador o pseudo instrucciones no tiene un código de operación, pero son importantes conocerlas tal como:
ORG Indica la dirección de inicio del programa.
EQU  Define o iguala el nombre de una variable un valor.
DEFB Define con un nombre un byte de memoria.
DEFW Define con un nombre una palabra de 2 bytes de memoria.
DEFM Define con un nombre una área de memoria para mensajes.
DEFS N Define un número N de bytes de memoria con un nombre una área de trabajo.
END Indica el fin del programa.
Programa PZ2
Ahora introducimos el siguiente programa PZ2 pide se introduzca DATO1 y DATO2 como 4 num hexadec se suma y resta y despliega los resultados.
                 ORG       7000H
DESP1     EQU    33H
;DATO1    EQU    02
;DATO2    EQU    02
INICIO     LD       HL,MSG1   ;DESPL DATO1
DMSG1   LD       A,(HL)         ;A=CARACTER
                 CALL   DESP         ;DESPL CARACT
                 INC      HL              ;INCR A SIG
                 CP       '='                ;ES FIN DE MSG1
                 JR     NZ,DMSG1 ;NO, OTRO CARAC
                 CALL  E4HEX
                 LD      (DATO1),HL                
                 LD      (DATO3),HL ;DATO3=DATO1
                 LD        A,' '
                 CALL   DESP         ;DESPL ESPACIO
                 CALL   D4HEX       ;DESPL HEXAD
                 LD        A,' '
                 CALL   DESP         ;DESPL ESPACIO
                 LD        HL,(DATO1)
                 CALL   DENT         ;DESPL ENTERO
                 LD        A,13
                 CALL   DESP         ;SIG LINEA
                 LD        HL,MSG2
DMSG2   LD        A,(HL)        ;DESPL DATO2=
                CALL    DESP
                 INC      HL
                 CP        '='
                 JR        NZ,DMSG2
                 CALL  E4HEX
                 LD      (DATO2),HL
                 LD        A,' '
                 CALL    DESP         ;DESPL ESPACIO
                 CALL    D4HEX       ;DESPL HEXADEC
                 LD        A,' '
                 CALL    DESP         ;DESPL ESPACIO
                 LD        HL,(DATO2)
                 CALL   DENT          ;DESPL ENTERO
                 LD        A,13
                 CALL   DESP          ;SIG LINEA
;SUMA 2 BYTES DE DATO1 Y DATO2
;RESULTADO QUEDA EN DATO1
;DATO1-X1X2-2 BYTES
;DATO2-Y1Y2-2 BYTES
;X1=X1+Y1  X2=X2+Y2
                 LD       IX,DATO1+1 ;1ER BYTE DER
                 LD       IY,DATO2+1
                 LD       A,(IX)             ;CARGA EN A
                 ADD    A,(IY)            ;SUMA 1ER BYTE
                 LD       (IX),A      ;GUARDA EN DATO1
                 LD       A,(IX-1)         ;SEG BYTE
                ADC    A,(IY-1)      ;SUMA 2BYTE Y C
                 LD       (IX-1),A     ;GUADA EN DATO1
                 CALL  C,DMSG5     ;DESBORDE
                 LD       HL,MSG3
DMSG3   LD        A,(HL)         ;DESPL SUMA=
                 CALL   DESP
                 INC      HL
                 CP       '='
                 JR       NZ,DMSG3
                 LD       HL,(DATO1)
                 CALL   D4HEX       ;DESPL HEXAD
                 LD        A,' '
                 CALL    DESP
                 LD        HL,(DATO1)
                 CALL   DENT         ;DESPL ENTERO
                 LD        A,13
                 CALL   DESP
;RESTA DATO2 DE DATO3 RESULTADO EN
;DATO3 RECORDAR QUE DATO3=DATO1
;DATO3-X1X2-2 BYTES
;DATO2-Y1Y2-2 BYTES
;X1=X1-Y1  X2=X2-Y2
                 LD       IX,DATO3+1
                 LD       IY,DATO2+1
                 LD       B,1           ;B=2 BYTES
                 XOR    A              ;LIMPIA CARRY
OTRO      LD       AE,(IX)     ;CARGA BYTE
                SBC     A,(IY)       ;RESTA BYTE
                 LD       (IX),A      ; GUARDA BYTE
                 DEC    IX
                 DEC    IY
                 DEC    B               ;DECREM B
                JR       NZ,OTRO  ;RESTA OTRO BYTE
;
;RESTA BINARIA
;0000 0010-A=02
;0000 0010-B=02
;0000 0000-A=00 X
;
;0000 0010-ACAR
;1111 1101-B'
;0000 0001-+1
;1111 1110-B''
;
;1111 1100-ACAR
;0000 0010-A=02
;1111 1110-B''
;0000 0000-A=00 CY=1
;
                 LD       HL,MSG4
DMSG4   LD        A,(HL)         ;DESPL RESTA=
                 CALL   DESP
                 INC      HL
                 CP       '='
                 JR       NZ,DMSG4
                 LD       HL,(DATO3)
                 CALL   D4HEX       ;DESPL HEXAD
                 LD        A,' '
                 CALL   DESP
                 LD       HL,(DATO3)
                 CALL   DENT         ;DESPL ENTERO
                 LD        A,13
                 CALL   DESP
                 RET                         ; REGRESA SO
;SUBRUTINA PARA DESPLEGAR MSG5
;DESBORDE DE SUMA
DMSG5    LD        LD,MSG5
DMSG51  LD        A,(HL)
                  CALL   DESP
                  INC      HL
                  CP       13
                  JR        NZ,DMSG51
                  RET
;
;CODIGO ASCII
;30=0 31=1 32=2 33=3 34=4 35=5 36=6 37=7
38=8 39=9...41=A 42=B 43=C 44=D 45=E 46=F
;SUMA BINARIA    RESTA BINARIA
;0+0=0                     0-0=0
;0+1=1                     0-1=1  CY=1
;1+0=1                     1-0=1
;1+1=0 CY=1           1-1=0
;
;SUBRUTINA PARA INTRODUCIR POR
;TECLADO CUATRO NUM HEXAD  A HL
E4HEX     LD          HL,0       ;HL=0
E4HEX1  CALL     TECLA    ;A=DIGITO HEXAD
                 CP         13           ;ES FIN
                 RET        Z            ;SI REGRESA
                 CALL     DESP       ;DESP A
                 CP          '0'               ;ES < 30(0)
                 JR          C,E4HEX1   ;SI IGNORA
                 CP         3AH             ;ES =< 39(9)
                 JR          C,ROTAR    ;SI 0-9
                 CP         'A'                 ;ES <41(A)
                 JR          C,E4HEX1   ;SI IGNORA
                 CP         'G'                 ;ES >=47(G)
                 JR          NC,E4HEX1 ;SI IGNORA
                SUB        7                   ;ES A-F
ROTAR   AND        15                ;A=0FH
                ADD       HL,HL
                ADD       HL,HL          ;DESPLAZA HL
                ADD       HL,HL          ;4 BITS A LA IZQ
                ADD       HL,HL          ;
                LD          D,0               ;D=0
                LD          E,A               ;E=A
                ADD       HL,DE          ;
                JR          E4HEX1        ;SIG DIGITO
TECLA    CALL     49H
                RET             
;SUBRUTINA PARA CONVERTIR HEXADEC DEL REG A Y DESPLEGARLO EN ASCII
D2HEX    PUSH   AF              ;GUARDA AF
                 RRCA                      ;A=02
                 RRCA
                 RRCA
                 RRCA                     ;A=20
                 CALL    D2HEX1
                 POP     AF              ;A=02
D2HEX1  AND    0FH            ;A=00  A=02
                 ADD   30H             ;A=30  A=32
                 CP      3AH             ;ES 30-39(0-9)
                 JR      C,DESP       ;SI, DESPL 30-39(0-9)
                 ADD   A,7              ;NO, ES 41-46(A-F)
DESP       CALL DESP1        ;DESPL CARACTER
                 RET
;SUBRUTINA PARA DESPLEGAR DE HL 
;CUATRO NUM HEXAD
D4HEX     LD          A,H          ;NUM SUPERIOR
                 CALL     D2HEX
                 LD          A,L           ;NUM INFERIOR
                JR          D2HEX
;SUBRUTINA PARA DESPLEGAR  EN
;ENTEROS EL REG  A QUE ESTA EN HL
DENT      LD          BC,-10000  ;BC=D8F0
                 CALL     DDEC1
                 LD          BC,-1000    ;BC=FC18
                 CALL     DDEC1
                 LD         BC,-100        ;BC=FF9C
;
-100D -64H
;
;0000 0000 0110 0100-64
;
;0000 0000 0000 0110-ACARREO
;1111 1111 1001 1011-64'
;0000 0000 0000 0001-+1
;1111 1111 1001 1100-BC=FF9C
;
                 CALL    DENT1
                 LD         BC,-10     ;BC=FFF6
;-10=-A
;0000 0000 0000 1010-A
;
;0000 0000 0000 0010-ACARREO
;1111 1111 1111 0101-A'
;0000 0000 0000 0001-+1
;1111 1111 1111 0110-BC=FFF6
;
                 CALL    DENT1
                 LD         BC,-1      ;BC=FFFF
;-1
;0000 0000 0000 0001-1
;
;1111 1111 1111 1110-1'
;0000 0000 0000 0001-+1
;1111 1111 1111 1111-BC=FFFF
;
DENT1     LD         A,'0'-1     ;A=30-1=29
DENT2     INC       A              ;A=30
                 ADD     HL,BC       ;HL=FFF8
;
;BC=-100 BC=FF9C PARA HL=0002
;0000 0000 0000 0000-ACARREO
;0000 0000 0000 0010-HL
;1111 1111 1001 1100-BC
;1111 1111 1001 1110-HL=FF9D CY=0
;
;BC=-10 BC=FFF6 HL=0002
;0000 0000 0000 1100-ACARREO
;0000 0000 0000 0010-HL
;1111 1111 1111 0110-BC
;1111 1111 1111 1000-HL=FFF8 CARRY=0
;
;BC=-1 BC=FFFF HL=0002
;1111 1111 1111 1100-ACARREO
;0000 0000 0000 0010-HL
;1111 1111 1111 1111-BC
;0000 0000 0000 0001-HL=0001 CY=1 A=31
;
:1111 1111 1111 1110-ACARREO
;0000 0000 0000 0001-HL
;1111 1111 1111 1111-BC
;0000 0000 0000 0000-HL=0000 CY=1 A=32
;
;0000 0000 0000 0000-ACARREO
;0000 0000 0000 0000-HL
;1111 1111 1111 1111-BC
;1111 1111 1111 1111-HL=FFFF CY=0 A=32
;        
                 JR        C,DENT2
                 SBC      HL,BC
;
;BC=-100 BC=FF9C HL=FF9D
;1111 1111 1001 1110-HL=FF9D
;1111 1111 1001 1100-BC=FF9C
;
;0000 0000 0000 0110-ACAR
;0000 0000 0110 0011-BC'
;0000 0000 0000 0001-+1
;0000 0000 0110 0100-BC''
;
;1111 1111 1111 1000-ACAR
;1111 1111 1001 1110-HL
;0000 0000 0110 0100-BC''
;0000 0000 0000 0010-HL=0002 A=30->0
;
;BC=-10 BC=FFF6 HL=FFF8
;0000 0000 0000 0100-ACARREO
;1111 1111 1111 1000-HL=FFF8
;1111 1111 1111 0110-BC=FFF6
;
;0000 0000 0000 0010-ACAR
;0000 0000 0000 1001-BC'
;0000 0000 0000 0001-+1
;0000 0000 0000 1010-BC''
;
;1111 1111 1111 0000-ACAR
;1111 1111 1111 1000-HL=FFF8
;0000 0000 0000 1010-BC''
;0000 0000 0000 0010-HL A=30->0
;
;BC=-1 BC=FFFF HL=0000
;0000 0000 0000 0000-HL
;1111 1111 1111 1111-BC
;
;0000 0000 0000 0000-B'
;0000 0000 0000 0001-+1
;0000 0000 0000 0001-B''
;
;0000 0000 0000 0000-HL
;0000 0000 0000 0001-B''
;0000 0000 0000 0001-HL  A=32->2
;
                 CALL    DESP        ;A=CARACTER
                 RET
;
MSG1      DEFM 'DATO1='
MSG2      DEFM 'DATO2='
MSG3      DEFM 'SUMA ='
MSG4      DEFM 'RESTA='
MSG5      DEFM 'DESBORDE SUMA...'
                 DEFB  13
DATO1    DEFW  0000H
DATO2    DEFW  0000H
DATO3    DEFW  0000H
;                CALL   440DH
                 END     INICIO
Cuando se termina de introducir todo el programa, para salir de Insert presionamos BREAK y salimos a EDTASM apareciendo * listo para recibir más comandos.
3.Ahora ensamblamos el programa con: A /NO/WE indicando /NO no se genere el programa objeto CMD y con /WE se pare en la línea que tenga errores. Al ensamblar el programa y encuentra errores, se para en el número de línea con error. Se puede corregir con replace Rnl reemplace número de línea, aparece el número de línea e introducimos la línea correcta con ENTER termina y  reemplaza toda la línea. Con edit Enl presionamos ENTER  después introducimos X y despliega  toda línea colocando el cursor al final de la línea y con backspace <- retroceder hasta corregir el error.
Observamos que en la parte izquierda aparece el código de operación y sus operandos de cada instrucción de lenguaje ensamblador de la derecha. El total de errores y la cantidad en bytes del área de memoria que queda. Una tabla de símbolos o etiquetas usadas en el programa indicando el número de línea donde aparecen.
4.Cuando ya no hay errores se procede a guardar el programa fuente SRC o ASM con W D=PZ2/ASM y la primera vez  aparece el mensaje de FILE NO EXISTENT ...REPLAY C TO CREATE IT  dar C para crearlo. Si ya existe aparece FILE ALREADY EXISTS...USE IT...(Y OR NO) dar Y si va sobre escribir el archivo,  para tenerlo en disco y volver a llamarlo en cualquier momento.
5.Ahora generamos el programa objeto, introduciendo solo A y aparece el mensaje  OBJECT FILESPEC? introducimos el nombre PZ2/CMD y la primera vez  aparece el mensaje de FILE NO EXISTENT ...REPLAY C TO CREATE IT  dar C para crearlo. Si ya existe aparece FILE ALREADY EXISTS...USE IT...(Y OR NO) dar Y si va sobre escribir el archivo.
6.Ahora está listo para ejecutarse, salimos a NEWDOS80 con B y aparece NewDos/80 Ready, introducimos DIR y vemos que esten los archivos PZ2/ASM y PZ2/CMD. Para ejecutarlo introducimos el programa objeto PZ2/CMD o solo PZ2.
7.Ejecutamos el programa y nos pide se introduzca DATO1= tecleamos 4 dígitos hexadecimales y van apareciendo en la pantalla damos ENTER y despliega el DATO1  en hexadec y entero decimal. Ahora DATO2= tecleamos 4 dígitos hexadecimales y van apareciendo en la pantalla damos ENTER y despliega el DATO2  en hexadec y entero decimal. Se ejecuta y aparece SUMA= la suma de DATO1 y DATO2 en hexadec y en entero decimal. Aparece RESTA= la resta de DATO1 menos DATO2 en hexadec y entero decimal.
Las computadoras incluyendo los microprocesadores como el Z80 funcionan con bits de 1 y 0. La operación básica de sumar la realiza siguiendo la tabla de suma binaria.
0+0=0
0+1=1
1+0=1
1+1=0 Cy=1 Acarreo de 1
Sea el caso de sumar dos bytes, DATO1=2 y DATO2=2 en binario es:
0000 0100-Acarreo
0000 0010-Dato1=02
0000 0010-Dato2=02
0000 0100-Suma=04
Ejecutar el programa e introducir DATO1=2 DATO2=2  y ver los resultados.

En un byte de 8 bits se puede almacenar un binario de 00000000 hasta un máximo de 11111111 y para obtener el equivalente del máximo valor entero, aplicamos la siguiente formula de 2^n-1, tenemos 2 elevado a n-1, donde n es el número de bits, para un byte n=8-1=7 para cada posición de izquierda a derecha.
1x2^7+1x2^6+1x2^5+1x2^4+1x2^3+1x2x^2+1x2^1+1x2^0=1x128+1x64+1x32+1x16+1x8+1x4+1x2+1x1=128+64+32+16+8+4+2+1=255
Para 2 bytes el máximo número que puede almacenar es FFFF hexadecimal y es 65535 en enteros, cuando se pasa hay un desborde o carry.
Introducir DATO1=FFFF DAT2=0  y observar que sucede. Ahora introducir DATO1=FFFF DAT2=1 que sucede, hay un desborde en la suma.

Si tenemos un byte de 01001010 el valor entero es:
0x2^7+1x2^6+0x2^5+0x2^4+1x2^3+0x2x^2+1x2^1+0x2^0=0x128+1x64+0x32+0x16+1x8+0x4+1x2+0x1=0+64+0+0+8+0+2+0=64+8+2=74
Es muy importante indicar que el byte de 01001010 se puede representar en hexadecimal como 4A y es igual al valor como entero de 74. Pero muy diferente 74 como hexadecimal, su valor como entero es 117.
Si introducimos en nuestro programa:74 o 74D     Lo considera como entero pero lo convierte a hexadecimal  y equivale a 4A. Lo concidera como hexadecimal y equivale a
74 de valor entero y sin la H dará un error.
Entonces las operaciones aritméticas solo acepta EDTASM en hexadecimales de valores enteros y al ejecutarse el programa objeto convierte de hexadecimal a binario y hace las operaciones en binario y los resultados los convierte y quedan en hexadecimal. Es muy pero muy importante entender estas representaciones de los números enteros como hexadecimal y binario. Pero también se pueden hacer operaciones con decimales  + y - utilizando aritmética de punto flotante.

No hay comentarios: