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: 8419
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 10:36 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.
Sí, a esto me refiero yo, cómo se organiza y cómo se utiliza :D
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:
Pues dale al que más te guste porque casi todos explican al final lo mismo.
El que cometaba de Spectrum es "Código máquina simplificado (volumen 2)" de Paul Holmes. Mucho es para Spectrum pero me gusta cómo explica las cosas y creo que ayuda mucho cuando explica las operaciones del Z80. Especialmente las interrupciones. Recomendado pero lástima que no lo veo escaneado :(
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 » Mié 30 Sep , 2009 1:37 am

Pues voy por el capítulo 6 y la impresión del libro es más que satisfactoria, lo veo cono bastante oficio a la hora de comunicar y sobre todo muy practico, cosa que tuve claro nada más ver el código del cargador hexadecimal tan útil como mínimo.

Por cierto, una duda que tengo. En la página 24 del libro (la 40 en el archivo pdf) en la última línea del código de ejemplo ¿Por que LD (BC), A hace que V% le sea devuelta la longitud de la cadena A$? :-k

Gracias!
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
coco
Me voy lanzando
Me voy lanzando
Mensajes: 73
Registrado: Mar 01 Ene , 2019 5:34 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor coco » Vie 04 Ene , 2019 8:20 pm

Pues voy por el capítulo 6 y la impresión del libro es más que satisfactoria, lo veo cono bastante oficio a la hora de comunicar y sobre todo muy practico, cosa que tuve claro nada más ver el código del cargador hexadecimal tan útil como mínimo.

Por cierto, una duda que tengo. En la página 24 del libro (la 40 en el archivo pdf) en la última línea del código de ejemplo ¿Por que LD (BC), A hace que V% le sea devuelta la longitud de la cadena A$? :-k

Gracias!
Hola Mode 2! Bueno, ya hace tiempo de este hilo así que a lo mejor llego tarde...

La llamada es:

Código: Seleccionar todo

CALL 40000,@V%,@A$
Te pongo el código comentado:

Código: Seleccionar todo

LD L,(IX+0) ; coge byte bajo del último parámetro (dirección del descriptor de la variable A$)
LD H,(IX+1) ; coge byte alto del último parámetro (dirección del descriptor de la variable A$)
LD A,(HL) ; el primer byte del descriptor de cadena es la longitud de la misma, la mete en A
LD C,(IX+2) ; coge byte bajo del primer parámetro (dirección de la variable V%)
LD B,(IX+3) ; coge byte alto del primer parámetro (dirección de la variable V%)
LD (BC),A ; la longitud que tenemos en A la metemos en la dirección de la variable V%
RET ; go back
El equivalente en BASIC sería:

Código: Seleccionar todo

POKE @V%, PEEK(@A$) ' es POKE direccion, byte, donde aquí byte es lo primero que hay en la dirección del descriptor de cadena, que es su longitud
salida.png
salida.png (5.89 KiB) Visto 756 veces
Espero que te aclare algo.

curro
Me voy lanzando
Me voy lanzando
Mensajes: 32
Registrado: Mar 23 Abr , 2019 7:35 pm

Re: RE: Ensamblando problemas (ejercicios de programación)

Mensajepor curro » Mié 23 Feb , 2022 5:38 pm

Busquemos soluciones para los siguientes casos:

Sumar 2 números de 8 bits, sumar dos números de 16.
Restar 2 números de 8 bits, Restar 2 números de 16 bits.
(de números que están en memoria)

En los números de 8 bits usando registros de 8 bits y en los de 16 haciéndolo mediante registros de 8 y de 16 bits. Con lo cual habrá 2 soluciones para los de 16 bits.


Condiciones:
Inicio del programa &4000

valor 1 8 bits &4100
valor 2 8 bits &4101
resultado suma se guardará en &4102
resultado resta se guardará en &4103


valor 1 16 bits &4104
valor 2 16 bits &4106

resultado suma1 se guardará en &4108
resultado suma2 se guardará en &410A
resultado resta1 se guardará en &410C
resultado resta2 se guardará en &410E
Bueno, aunque ya han pasado unos cuantos años de este mensaje, siempre viene bien para los que estamos retomando el tema y desoxidándonos con el ensamblador. Mando mi solución para 16 bits pues de la de 8 ya se ha hablado en mensajes anteriores. Si alguien puede comentar algo pues genial. Gracias por el reto :D

Código: Seleccionar todo

; Suma/resta 16 bits
; Valores originales en &4104 y &4106
; Suma con registros 8 bits
; Resultado en &4108
ld a,(&4104)
ld hl,&4106
ld b,(hl)
add a,b
ld (&4108),a

ld a,(&4105)
ld hl,&4107
ld b,(hl)
adc a,b ; tengo en cuenta el acarreo previo
ld (&4109),a


;Resta con registros de 8 bits
; Resultado en &410c
ld a,(&4104)
ld hl,&4106
ld b,(hl)
sub b
ld (&410c),a

ld a,(&4105)
ld hl,&4107
ld b,(hl)
sbc a,b ; tengo en cuenta el acarreo previo
ld (&410d),a

; Suma con registros 16 bits
; Valores originales en &4104 y &4106
; Resultado en &410a
ld hl,(&4104) ; esto coge tanto &4104 como &4105 en hl
ld bc,(&4106)
add hl,bc
ld (&410a),hl

; Resta con registros 16 bits
; Resultado en &410e
ld hl,(&4104) ; esto coge tanto &4104 como &4105 en hl
ld bc,(&4106)
xor 0 ; Para asegurar que el carry está a 0 (no afecta a A)
sbc hl,bc
ld (&410e),hl
ret

Raulgarfer
Lechoncillo
Lechoncillo
Mensajes: 6
Registrado: Dom 31 Dic , 2017 12:23 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Raulgarfer » Jue 24 Feb , 2022 1:50 pm

Muy bien curro. A ver si se anima esto también!!!.

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Urusergi » Vie 25 Feb , 2022 10:36 pm

una solución un pelín mejor para la suma de 8 bits:

Código: Seleccionar todo

; Suma/resta 16 bits
; Valores originales en &4104 y &4106
; Suma con registros 8 bits
; Resultado en &4108
org &4000
ld a,(&4104)
ld hl,&4106
add a,(hl)
ld (&4108),a

ld a,(&4105)
ld hl,&4107
adc a,(hl) ; tengo en cuenta el acarreo previo
ld (&4109),a
Y la suma en 16 bits:

Código: Seleccionar todo

org &4000
ld hl,(&4104)
ld de,(&4106)
add hl,de
ld (&410a),hl
ret

curro
Me voy lanzando
Me voy lanzando
Mensajes: 32
Registrado: Mar 23 Abr , 2019 7:35 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor curro » Sab 26 Feb , 2022 9:36 am

Genial, claro, se puede obviar el uso de b. Gracias!

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor Urusergi » Sab 26 Feb , 2022 5:24 pm

Veo que también pusiste la misma rutina para la suma de 16 bits :oops:

En el caso de la resta en 16 bits, para asegurar que carry=0 es mejor usar <or a>, <and a> o <cp a> en vez de <xor 0>

Un saludo.

curro
Me voy lanzando
Me voy lanzando
Mensajes: 32
Registrado: Mar 23 Abr , 2019 7:35 pm

Re: Ensamblando problemas (ejercicios de programación)

Mensajepor curro » Sab 26 Feb , 2022 6:36 pm

Entiendo, tampoco afectan al acumulador y son instrucciones más eficientes en bytes y ciclos. Gracias!


¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot]


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