Ensamblando problemas (ejercicios de programación)

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Vie 09 Jun , 2006 9:55 am

El complemento a 2 es una forma de representar tanto números negativos como positivos. Para saber si es un número negativo, en complemento a 2, hay que comprobar que tiene el bit más significativo igual a 1.
La intrucción NEG convierte un número positivo en negativo y viceversa.
Por lo tanto, si hacemos el complemento a 2 del segundo número y lo sumamos al primero también tendremos otra forma de encontrar la resta.

Código: Seleccionar todo

numero1_8 equ &4100
numero2_8 equ &4101
suma8 equ &4102
resta8 equ &4103

LD HL,numero2_8
LD A,(HL)
NEG
DEC HL
ADD (HL)
LD (resta8),A
Salu2,
Arta

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Mensajepor MiguelSky » Vie 09 Jun , 2006 2:26 pm

Las variables también acortan el programa... Arta, cuéntanos lo de los ciclos, dónde esta disponible esa información y si hay alguna manera de "automatizar" el recuento de bytes y ciclos...

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Mensajepor Mochilote » Vie 09 Jun , 2006 2:31 pm

Arta, cuéntanos lo de los ciclos, dónde esta disponible esa información y si hay alguna manera de "automatizar" el recuento de bytes y ciclos...
La info de los ciclos está en practicamente todos los libros de z80, tambien la tenemos libremente en CPC Firmware Guide, en unas tablas bastante buenas, pero desgraciadamente incompletas en la versión de PDF, le faltan las instrucciones que comienzan por A, jeje.

Respecto a contar ciclos, me temo que es como jugar al mus, hay que hacerlo a mano/cabeza.

Saludos.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Vie 09 Jun , 2006 2:50 pm

Pooo zí, me temo lo mismo que Mochilote, hay que hacerlo de cabeza o con un lápiz.
Bueno, también se puede hacer un programita que analice el código fuente y diga el número de ciclos pero no se si merece la pena porque no cuesta tanto contarlos.

El número de ciclos (y el de bytes) lo podemos encontrar en cualquier documento de Z80, yo uso un pdf (z80.pdf) que rula por la red. Cada instrucción tiene la información de cómo se usa y cuanto tarda y ocupa.
Por ejemplo,
LD A,1 ; ocupa 2 bytes y requiere 2 ciclos de CPU

Para medir la eficiencia de un algoritmo o de un rutina frente a otra podéis hacer como dijo Mochilote en otro tema:
http://www.amstrad-esp.com/index.php?na ... opic&t=227
Salu2,
Arta

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Mensajepor MiguelSky » Vie 09 Jun , 2006 2:54 pm

Motruos !! :D

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: La primera parte del ejercicio

Mensajepor Mode 2 » Dom 11 Jun , 2006 9:35 pm

;Suma y resta de 8 bits

org &4000

ld a,30
ld (&4100),a
ld a,20
ld (&4101),a

ld a,(&4100)
ld b,a
ld a,(&4101)
add b
ld (&4102),a

ld a,(&4101)
ld b,a
ld a,(&4100)
sub b
ld (&4103),a

ret
;Suma y resta de 8 bits
numero1 equ 50
numero2 equ 30

org &4000
ld hl,&4101
ld (hl),numero2
dec hl
ld (hl),numero1

;suma
add a,(hl)
inc hl
add a,(hl)
inc hl
ld (hl),a

;resta
sub (hl) ;colocamos el acumulador a 0. Un byte menos que ld a,0
dec hl
dec hl
add a,(hl)
inc hl
sub (hl)
inc hl
inc hl
ld (hl),a

ret

Mejor así, ¿verdad Arta?

Por cierto Miguelsky lo de los ciclos viene en los apéndices del libro de código máquina que he subido.

Ésto envicia!! :shock:

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: La primera parte del ejercicio

Mensajepor Artaburu » Dom 11 Jun , 2006 11:21 pm


;Suma y resta de 8 bits
numero1 equ 50
numero2 equ 30

org &4000
ld hl,&4101
ld (hl),numero2
dec hl
ld (hl),numero1

;suma
-> aquí sumas el numero1 a lo que hay en el acumulador. Tendrías que ponerlo a 0, pero mejor hacer un ld a,(hl) ¿no? ;)
add a,(hl)


inc hl
add a,(hl)
inc hl
ld (hl),a

;resta

-> aquí te pasa lo mismo que antes, no sabes lo que hay en el acumulador.
bueno, en este caso sí, pero si fuera una rutina independiente tendrías que hacer algo con el acumulador.
-> mañana lo miro con más calma q esta resta es un poco rara... ;)
-> ah, una forma rápida de poner a 0 el acumulador es XOR A (si no importa lo que pase con los flags)
sub (hl) ;colocamos el acumulador a 0. Un byte menos que ld a,0
dec hl
dec hl
add a,(hl)
inc hl
sub (hl)
inc hl
inc hl
ld (hl),a

ret

Mejor así, ¿verdad Arta?

Por cierto Miguelsky lo de los ciclos viene en los apéndices del libro de código máquina que he subido.

Ésto envicia!! :shock:
Salu2,
Arta

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Mensajepor Mode 2 » Lun 12 Jun , 2006 12:13 am

Cierto, en la primera linea de la suma me he equivocado y dónde quería colocar ld a,(hl) he puesto add a,(hl). :oops:

Y en la resta la manera de poner a cero el acumulador era restando el propio contenido del acumulador: sub (hl). Pero mejor: xor a,a bien apuntas.

Gracias!!

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 12 Jun , 2006 8:53 am

Pero te lías un poco en la resta aunque está bien.

Cambiando

Código: Seleccionar todo

sub (hl) ;2 ciclos, 1 byte
dec hl ;1 ciclo, 1 byte
dec hl ;1 ciclo, 1 byte
add a,(hl) ;2 ciclos, 1byte
se usan 6 ciclos y 4 bytes
por

Código: Seleccionar todo

XOR A ;1 ciclo 1 byte
ld HL,numero2 ;3 ciclos 3 bytes
4 ciclos, 4 bytes

y el resto me cuadra bastante.

Dejo una pregunta en el aire:
¿También podríamos ahorrar ciclos y bytes usando la pila?
Salu2,
Arta

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Mensajepor Mode 2 » Lun 12 Jun , 2006 10:37 am

Pero te lías un poco en la resta aunque está bien.

Cambiando

Código: Seleccionar todo

sub (hl) ;2 ciclos, 1 byte
dec hl ;1 ciclo, 1 byte
dec hl ;1 ciclo, 1 byte
add a,(hl) ;2 ciclos, 1byte
se usan 6 ciclos y 4 bytes
por

Código: Seleccionar todo

XOR A ;1 ciclo 1 byte
ld HL,numero2 ;3 ciclos 3 bytes
4 ciclos, 4 bytes

y el resto me cuadra bastante.
Joder otra verz, donde puse add a,(hl) quise poner ld a,(hl)!! :oops:

Por cierto, no me quedo con el concepto de 'ciclo'. ¿Que me puedes contar?

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 12 Jun , 2006 12:06 pm

Los ciclos son una unidad de medida que representa el tiempo que le lleva al procesador ejecutar la instrucción. Tiene en cuenta los accesos a memoria para buscar los operandos, para escribir y el tiempo de interpretar y ejecutar la instrucción.
Salu2,
Arta

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Mode 2 » Lun 28 Sep , 2009 8:43 pm

Joder, ha pasado más de tres añooos!! Lo que hacen unas opos y el olvido!!! :shock: :shock:

Arta, me veo con fuerzas y tengo muchas ganas de sacarle partido a mis CPCs, y en extensión a toda la cole de retroordenadores que tengo, y no quiero que sea solo jugando a juegos sino haciendo mis pinitos de programación y otras cosas tambien. No quiero que sean meras piezas de museo.

Creo que ya te pregunte al respecto en algun post sobre "si ensamblador o C bajo Z80". Antes era intentar hacer un juego y claro con C ves antes los resultados y no te desesperaba como en ensamblador pero ahora despues de ver lo complicado de un juego me interesa más el ensamblador para a través de pequeñas rutinas conocer la maquina por dentro. No sé si estoy en lo cierto.

Tenía pensado hacer alguna rutina para CPC y luego su homologa para Spec, MSX y C64 para conocer la arquitectura de estos en comparación
¿Crees que es una locura?
¿Crees que es mejor primero CPC y luego si sigo vivo los otros? :lol:

Que libro o texto me aconsejas? Este está bien: "Domine el codigo maquina en su amstrad cpc 6128 664 464 ed2007dadman.pdf" u otro mejor?

Sobre todo me gustaría que apareciesen pequeñas rutinas y que explicase su funcionamiento.

Muchas gracias!!

p.d. De momento, a ver si me libero un poco y me leo todos los posts de programación del foro para reactivarme! ](*,)
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.

Avatar de Usuario
Metalbrain
Forero habitual
Forero habitual
Mensajes: 151
Registrado: Mar 30 Oct , 2007 1:45 pm
Ubicación: Sevilla

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Metalbrain » Mar 29 Sep , 2009 1:01 pm

Tenía pensado hacer alguna rutina para CPC y luego su homologa para Spec, MSX y C64 para conocer la arquitectura de estos en comparación
¿Crees que es una locura?
¿Crees que es mejor primero CPC y luego si sigo vivo los otros? :lol:
Tú mismo verás que es lo que más te apetece hacer, pero ten en cuenta que el C64 tiene un procesador totalmente diferente (6502), y dependiendo de lo que hagan las rutinas, tendrás o no que saber sobre las particularidades de cada ordenador.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Artaburu » Mar 29 Sep , 2009 4:58 pm

No se, Mode 2, a tu gusto. Pero lo que te comenta Metalbrain es cierto, a parte de que el C64 tiene un lenguaje propio, las rutinas específicas de cada máquina aún en Z80 serán diferentes. Ten en cuenta, además, que en el CPC, las rutinas que hay para programar sus dispositivos (teclado, pantalla, etc) son, digámoslo así, fijas. No dan demasiada libertad al programador (aquí alguno saltará con cómo hacer malabarismos con el Gate Array, pero esto es para usuarios expertos y avanzados y con inquietudes, jeje, a mí me vale con lo que ya hay). Me refiero a que hay un determinado código para cambiar los colores y leer el teclado y salirse de ahí es un poco exagerado y superfluo.

Si quieres conocer la arquitectura del CPC a nivel lógico, capacidades y funcionamiento, lo puedes hacer leyendo ciertos documentos… la aplicación práctica está más que explotada y desarrollada y puedes encontrar las rutinas en los posts de Syx en ensamblador, por ejemplo.

Si quieres ver resultados rápidamente, aunque no sea un juego, tiraría por C, podrás hacer muchas cosas útiles en poco tiempo, además, ten en cuenta que desde C puedes programar rutinas en ensamblador de un modo muy sencillo.
Y como material de lectura... yo no me he leído, específicamente, libros en los que se muestran rutinas, creo que es mejor un libro conceptual que explique las ideas y cómo aplicarlas a que te den un trozo de código para picarlo. Yo empecé leyendo un manual de Z80 en plan durillo que estaba en francés (creo que algo de Dr Watson) y que me gustó bastante porque venían algunos ejemplillos chorras pero útiles. Seguro que hay más así. Aún así, seguro que cualquier libro de ensamblador escaneado que hay por ahí es muy útil. Encuentra uno que te enganche, es importante también este factor, no es lo mismo leerse un tocho de comandos y sentencias que uno que tenga algo de literatura. A mí me encanta un librito de spectrum que va contando las inquietudes del programador y todo mientras explica algunas cosas. A ver si luego lo encuentro y te pongo el título. Eso sí, a mí me encanta leer en papel… yo me imprimiría mi libro de cabecera y lo tendría a mano :D

Pero lo primero es que tengas claro lo que quieres hacer: Aprender a programar o hacer un programa. Para lo que necesites, aquí me tienes.
Salu2,
Arta

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Mode 2 » Mar 29 Sep , 2009 6:41 pm

Cuando hablo de conocer la estructura me refiero a como esta colocada la memoria, que registros usa, interrupciones, etc ... no el tema de arquitectura física.

Por ejemplo, tengo fotocopiado el de 'Co/Ma para principiantes con Amstrad" pero no me engancha tanto. Además tengo un libro de Z80 de Rodnay Zacks en original pero no sé como está pero el libraco tira para atrás!!

De momento, estoy leyéndome 'Domine ......' porque como tú bien dices me ha enganchado aunque lo tengo sin imprimir.

Gracias por tu ofrecimiento Arta!! :wink:
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic