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.
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.
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.
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
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.
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.
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:
Publicar un comentario