Fecha actual Dom May 19, 2013 12:25 pm


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
  • Autor
  • Mensaje
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

NotaVie Jun 09, 2006 8: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
Desconectado
Avatar de Usuario

MiguelSky

Siempre vigilo

Siempre vigilo

  • Mensajes: 4345
  • Registrado: Sab Oct 08, 2005 1:02 am

NotaVie Jun 09, 2006 1: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...
Imagen
Desconectado
Avatar de Usuario

Mochilote

Keeper of The Forum

Keeper of The Forum

  • Mensajes: 835
  • Registrado: Sab Oct 08, 2005 3:26 pm

NotaVie Jun 09, 2006 1:31 pm

MiguelSky escribió: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.
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

NotaVie Jun 09, 2006 1: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
Desconectado
Avatar de Usuario

MiguelSky

Siempre vigilo

Siempre vigilo

  • Mensajes: 4345
  • Registrado: Sab Oct 08, 2005 1:02 am

NotaVie Jun 09, 2006 1:54 pm

Motruos !! :D
Imagen
Desconectado
Avatar de Usuario

Mode 2

Master of The Forum

Master of The Forum

  • Mensajes: 1449
  • Registrado: Lun Oct 10, 2005 7:01 pm
  • Ubicación: Sevilla, años 80.

Re: La primera parte del ejercicio

NotaDom Jun 11, 2006 8:35 pm

Nemesis_v2.0 escribió:;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:
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

Re: La primera parte del ejercicio

NotaDom Jun 11, 2006 10:21 pm

Nemesis_v2.0 escribió:
;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? ;)

Nemesis_v2.0 escribió: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)
Nemesis_v2.0 escribió: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
Desconectado
Avatar de Usuario

Mode 2

Master of The Forum

Master of The Forum

  • Mensajes: 1449
  • Registrado: Lun Oct 10, 2005 7:01 pm
  • Ubicación: Sevilla, años 80.

NotaDom Jun 11, 2006 11:13 pm

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!!
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

NotaLun Jun 12, 2006 7: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
Desconectado
Avatar de Usuario

Mode 2

Master of The Forum

Master of The Forum

  • Mensajes: 1449
  • Registrado: Lun Oct 10, 2005 7:01 pm
  • Ubicación: Sevilla, años 80.

NotaLun Jun 12, 2006 9:37 am

Artaburu escribió: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?
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

NotaLun Jun 12, 2006 11:06 am

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
Desconectado
Avatar de Usuario

Mode 2

Master of The Forum

Master of The Forum

  • Mensajes: 1449
  • Registrado: Lun Oct 10, 2005 7:01 pm
  • Ubicación: Sevilla, años 80.

Re: Ensamblando problemas (ejercicios de programación)

NotaLun Sep 28, 2009 7: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! ](*,)
Visita mi rastrillo retro actualizado para cambio/venta en: http://retrocambia-con-mode2.es.tl/

'Si el Pac-Man hubiese influido a nuestra generación, estaríamos todos corriendo en salas oscuras, masticando píldoras mágicas y escuchando músicas electrónicas repetitivas.'
Desconectado
Avatar de Usuario

Metalbrain

Forero habitual

Forero habitual

  • Mensajes: 135
  • Registrado: Mar Oct 30, 2007 1:45 pm
  • Ubicación: Sevilla

Re: Ensamblando problemas (ejercicios de programación)

NotaMar Sep 29, 2009 12:01 pm

Mode 2 escribió: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.
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

Re: Ensamblando problemas (ejercicios de programación)

NotaMar Sep 29, 2009 3: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
Desconectado
Avatar de Usuario

Mode 2

Master of The Forum

Master of The Forum

  • Mensajes: 1449
  • Registrado: Lun Oct 10, 2005 7:01 pm
  • Ubicación: Sevilla, años 80.

Re: Ensamblando problemas (ejercicios de programación)

NotaMar Sep 29, 2009 5: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:
Visita mi rastrillo retro actualizado para cambio/venta en: http://retrocambia-con-mode2.es.tl/

'Si el Pac-Man hubiese influido a nuestra generación, estaríamos todos corriendo en salas oscuras, masticando píldoras mágicas y escuchando músicas electrónicas repetitivas.'
AnteriorSiguiente

¿Quién está conectado?

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


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