Ah, si yo hubiese tenido estas explicaciones y estas herramientas en mis tiempos... Ahora con 53 años estoy empezando con su curso. Es genial. Muchas gracias por dedicarnos su tiempo.
Que hermoso compartir el conocimiento de una manera tan didactica! Increible haber encontrado tan buen curso y que ademas sea de la universidad de Alicante. Yo tome unos cursos de introduccion al desarrollo web de Sergio Lujan Mora de esta universidad.Ustedes son de lo mejor. Saludos de Argentina!!!🤩
Gracias profesor, estoy siguiendo su curso de ensamblador del Z80 , en los años 80, tecleaba en mi spectrum código máquina ,con la ilusión de descubrir y aprender lo que había detrás del código de mis juegos favoritos,aquella magia me atrapó y después de muchos años vuelvo al tema , gracias por sus clases, un Saludo
Qué guay, yo estudié letras y esto me parece fascinante! Me estoy metiendo poco a poco en el mundo del desarrollo web pero como soy curioso por naturaleza acabo viendo ensamblador xD. He visto varios vídeos suyos y coincido en que hay que entender el proceso de las cosas para ser mejor, aunque solo me dedicara a hacer páginas webs veo fundamental entender cómo funciona todo. Muchas gracias por los vídeos, no deje de subirlos por favor!
Me hubiese encantado tenerte como profesor cuando empece ingeniería técnica en informática de sistemas, me encantaba las asignaturas técnicas, pero mis maestros no eran tan pedagógicos como tu, y nunca aprendí ensamblador, solo en una sesión me has enseñado (Y lo he entendido) como funciona un programa a nivel de máquina. Tendría que haber más maestros tan altruistas como tu. Un saludo y ¡¡¡Muchísimas gracias!!!
esta 10/10, pero agunos que no estan relacionados no sabran de conceptos como yo pero me hice una idea despues de experimentar a base de prueba y error y me vine a reforzarlo aca,(por si no llegas a entender y sientes que quieres rendirte lee mi comentario si no te sientes asi vuelve a hacer lo que te dice el profe xd) posdata: esto mas que nada son notas y conceptos que yo nombre o de pura casualidad sabia asi que no es explicacion de el video de el 1er reto, solo doy mis deducciones y pueden estar mal, tu debes sacar tus propias deducciones. segun lo que practique, solo puedes usar las letras de A-F, y cualquier numero(el profesor te explica como se secciona el codigo por asi desirlo) y tiene 3 partes: lo que copea un valor en la cpu, 3E (valor) ubicacion donde se guarda 00C0 y otro que termina el programa(este es el video que nos presenta el codigo th-cam.com/video/NxI2kBarAhw/w-d-xo.html ) asi que solo vamos a tocar el valor y toda la ubicacion. despues de tocar un rato el valor vez que solo puedes poner 2 digitos o 2 letras: 88 o AA o 8A (obvio no se especifica en esos valores). todo el pad numerico esta permitido de 0-9 o de 1-0(segun teclado) (todo exepto el siguiente punto lo deduje solo incluyendo lo de las separaciones y la funcion del codigo ) el cpu trabaja con valor exadecimal y el valor exadecimal es hasta el numero 16 y lo que para mi es lo mas inportante no debes ver el 88 como ochenta y ocho (aunque solo es para hacerte a una idea, habra ocaciones en las que me contradiga pero creo que facilita un poco el entendimiento)si no que como 8 y 8 no son 2 digitos si no que 2 numeros juntos, lo de el valor exhadecimal lo vi aqui ( este video pero voy a reenviar este mensaje a el comentario de el primer video th-cam.com/video/69aj0Vs8D8c/w-d-xo.html ) no puedes escribir 1616 en ensamblado proque seria algo completamente distinto a lo que quieres hace, si no que escribiras A en caso de 10 B en caso de 11 y asi(yo recomiendo ver el sistema hexadecimal despues de tocar un rato el codigo porque si siento que hace mucha falta) todo lo que llevo de el curso esta muy bien asi que es un honor comentarlo y explicar unos puntos que me parecen importantes
Vale, como no tengo muy claro en qué parte tienes más duda, te explico varias. Primero, la pila solo son datos en la memoria RAM y puede estar en cualquier parte de la RAM. No existe una zona reservada para la pila aparte del resto de la RAM, por así decirlo. De hecho, como digo en otros vídeos, "la pila no existe" :). Esto quiere decir que en realidad sólo es una forma conveniente de leer y escribir datos en la RAM siguiendo un orden. Dicho esto, vamos con "donde está". Cuando se enciende un ordenador, sea cual sea, todas las memorias volátiles están a 0. Por tanto, los registros de la CPU, que son memorias volátiles igual que la RAM, están todos a 0. En particular, el registro SP (Stack Pointer) del Z80, estará a 0 también. Eso significa que "el tope de la pila estará en la posición 0" al comenzar. Como digo, esto no es "real". No hay nada en la RAM al comenzar y no hay zonas especiales de la RAM. Lo único que "da vida" a la pila es el registro SP y las instrucciones que usan ese registro (como PUSH, POP, CALL y RET). Si nunca usasemos una instrucción que dependa del valor de SP, "no habría ninguna pila" en memoria, porque nunca leeriamos ni escribiríamos en RAM donde dice SP. Dicho esto, lo que ocurre al arrancar es que el Z800 empieza a leer de la memoria, en este caso de la ROM, empezando en la posición 0 (porque el registro PC está también a 0 al encender). Ahí, en ROM, está el código de arranque del firmware del Amstrad CPC. Y este código pone todas las cosas como le gusta al Firmware y al BASIC del CPC. En particular, cambia el valor de SP para ponerlo e C000, que es donde habitualmente lo en encontramos con la máquina funcionando. Con todo esto, espero que entiendas que "la pila" no es más que un concepto, y que su técnica se reduce a una dirección de memoria indicada en SP y unas instrucciones de la CPU que leen y escriben en memoria teniendo en cuenta lo que dice SP. Si entiendes eso bien, seguro que podrás hacer muy buen uso de ello cuando lo necesites :) Espero haber respondido tus dudas.
@@ProfesorRetroman si entiendo pero en la NES o el 6502 el Stack pointer está entre un rango de $0100 - $01FF por eso pensé que en el z80 sucedía lo mismo gracias por la respuesta
@@jhonbrayanangaritamedina1047 En el 6502 sucede eso porque el SP es de 8 bits, no de 16. Por eso, en realidad, el SP solo puede estar de 00 a FF. El hecho de situarlo en 01xx es una decisión de diseño, porque hay que añadir los 2 dígitos superiores para formar una dirección completa de memoria y el bloque 00xx se reserva en el 6502 para la página 0 de memoria (que hace como si fueran 256.registros virtuales). En este caso, SP empezará igualmente en 0, pero será 00 en vez de 0000 como en el Z80, porque solo tiene 8 bits.
Para este tipo de información, puedes acudir siempre a los links que tienes en las descripciones de este y de casi cualquier otro video :) [Web del curso]: bit.ly/CursoDEZ80 [Grupo de Telegram]: t.me/asmz80 Espero que lo disfrutes
Un trabajo excelente Profesor. Me pregunto como puedo guardar el programa que tengo introducido en memoria en un archivo, para posteriormente cuando vuelva a ejecutar WinAPE, poder rescatar todo lo que he introducido. Gracias.
Gracias de nuevo por tus palabras. Por si no lo has encontrado ya, la forma más fácil de guardar el programa en WinAPE es seleccionado la zona de memoria que quieres guardar en la ventana de volcado de memoria, pulsando botón derecho y eligiendo Save. Con eso guardas un fichero binario que contendrá exactamente lo que hayas seleccionado. Para volverlo a cargar, botón derecho sobre un byte de la memoria donde quieras cargarlo y eliges Load. También puedes cortar y copiar lo que selecciones en el volcado de memoria con control+C, control+X y control+V, copiarlo a un editor de texto y de vuelta ahí. Eso puede ser cómodo a veces para programar. Por último, puedes guardar snapshots, en el menú principal de WinAPE que son imágenes completas del estado de la máquina en un instante dado. Si los vuelves a cargar después, es como volver a iniciar la máquina exactamente como la dejaste para que continúe desde ese punto. Puede ser útil también.
@@ProfesorRetroman Muchas gracias Profesor. Sí, ya probé lo de selecciona las posiciones de memoria. Pero alguno de los aspecto que menciona en su respuesta no lo sabía. Genial :) No se lo que es exactamente un "Snapshot" pero consultaré a Google. Gracias.
Muy buenas profesor, muchas gracias por enseñar de esta manera tan didáctica, ahora si le formulare las preguntas como corresponde. winape es el emulador de Amstrad CPC verdad? este lenguaje ensamblador es solo aplicable al z80 ?? Al iniciar el emulador sale una pantalla azul comienza con la frase "Amstrad Microcomputer (v4)", esa frase esta dibujada ahí ? a que me refiero con dibujada , por ejemplo , no existe una variable que almacene esa palabra, esta siendo dibujada pixel por pixel en la memoria de video? La memoria que vemos es ROM, RAM ? es posible generar un archivo maquina desde C y cargarlo o escribirlo en la mapa de memoria del emulador de CPC? Saludos profesor y disculpe si ya había respondido estas preguntas o si no formulo bien.
Correcto. WinAPE es un emulador de Amstrad CPC, y el lenguaje ensamblador que imparto en estas clases es específico del procesador Z80. Cada procesador tiene su propio conjunto de instrucciones, por tanto distinto código máquina y, a menudo, distinto ensamblador también. Todo lo que se dibuja en pantalla tiene muchos procesos por debajo que terminan traduciéndose a píxeles, porque el haz de electrones del monitor dibuja píxeles. En Amstrad, esto se hace modificando la memoria de vídeo, que es la que se esta enviando al haz de electrones. Si se modifican los valores de esa parte de la RAM, cuando sea enviada de nuevo al monitor en el siguiente fotograma, los píxeles cambiarán. Para que se vean las letras, hay una serie de rutinas que están ya incluídas en el firmware de la máquina (en ROM), que son las que dibujan los píxeles adecuados para formar letras. Para hacerlo, en la ROM están guardadas las definiciones píxel a píxel de todos los caracteres y son las que se usan para dibujarlos en pantalla. Es posible generar código máquina de cualquier manera. Puedes hacerlo a mano o escribir programas que los generen. El código máquina no es más que una secuencia de números, uno detrás de otro. Eso es muy facil de generar. Los compiladores traducen de C a ensamblador, y luego un progama ensamblador traduce de lenguaje ensamblador a código máquina, generando en un fichero la secuencia de bytes que es el código máquina. Después sólo hay que cargar esa secuencia en memoria, para poder ejecutarla. Y como ya te comenté anteriormente, hay compiladores de C que generan ensamblador Z80, como SDCC, que viene incluído en CPCtelera. Por tanto, este y otros compiladores, generan ensamblador Z8 como salida, que después se ensambla y genera un fichero binario en código máquina Z80. Cargando ese fichero en memoria en un Amstrad, el procesador puede ejecutarlo.
Hola Profesor, estoy siguiendo tu canal con mucho interés y voy a empezar como indicas con el emulador WinAPE, pero me surge la pregunta ¿puedo hacer lo mismo directamente sobre mi Amstrad CPC? Muchas gracias por todo y enhorabuena por tu sabiduría.
Es una buena pregunta. La respuesta es técnicamente SI, pero prácticamente NO. Es decir, todo lo que hagas en el emulador funcionaría exactamente igual en una máquina real. El problema es que en la máquina real no dispones de un depurador para detener la máquina, ver la memoria, cambiar su contenido, saltar de un sitio a otro. La facilidad y versatilidad del emulador en este sentido es mucho mayor. Aún así, tienes formas de probar programas similares en la máquina real, claro que sí. Puedes introducir datos en posiciones de memoria desde BASIC con POKE, y puedes ejecutar lo que has introducido saltando a la posición inicial con CALL. Hay más formas, pero esta sería la más sencilla.
@@ProfesorRetroman De acuerdo probaré alguna cosilla en el Amstrad real, pero voy a descargarme el emulador y a seguir tus cursos con interés, tengo mucha ilusión por aprender, muchas gracias por todo.
Gracias por el curso, ya me gustaria ami asistir a tus clases :D. Estoy intentando seguirlo usando un cpc real, tambien voy viendo la teoria que me parece fascinante. He intentado hacer este ejercicio usando poke y peek del BASIC 1.1, pero aunque todos los valores Hex estan en su sitio en la RAM...4000 a 4006...al hacer un call 4000, el punto rojo aparece en un lugar aleatorio cada vez, incluso alguna vez me ha cambiado de color y/o forma, ademas el cpc se cuelga, no se si es por el bucle JR, pero no puedo hacer break. Alguna idea?
Como te indicaba en la respuesta a tu anterior comentario, es mejor que aprendas primero en el emulador y sigas el curso como está indicado. Si haces cosas distintas, puedes obtener resultados distintos, como en este caso. Además, como es el primer nivel del curso, no puedo explicar toda la teoría del CPC al completo antes de empezar a trabajar, ni puedo prever todas las cosas que se pueden hacer distintas a como propongo. Supongo que entiendes lo que quiero decir. Al hacerlo en BASIC estarás introduciendo los comandos a mano, y provocando que la pantalla haga scroll vertical al llegar abajo. Cuando haces eso, el scroll cambia los parámetros de la memoria de vídeo (pues es un scroll por hardware). Esto hace que la posición C000 esté en otro sitio, porque se haya movido. Tanto en el comentario anterior como en el vídeo explico que el programa termina con un bucle infinito. Eso significa que el ordenador se queda ahí colgado a propósito. Es parte de nuestro programa y la forma de evitar que continúe ejecutando otras cosas para poder ver lo que ha sucedido. En un CPC real, la única forma de salir de ahí es reiniciando. Al igual que en mi respuesta anterior, te recomiendo que sigas el curso en el emulador para aprender mejor. Una vez hayas aprendido y domines la máquina, no tendrás problema en usar tus conocimientos en un CPC real para hacer lo que quieras.
Gracias por responder. Ya entiendo lo que quieres decir, lo tendre en cuenta. Mi objetivo es dominar el Z80 de cara a escribir un controlador de sonido para sega megadrive (que usa el z80 de co-procesador para controlar 2 chips de sonido). Asi que el cpc es perfecto para empezar por algo mas simple. Ah y disculpa por el anterior mensaje, lo escribi y lo borre rapido por que no lo tenia claro jaja.
Mi primer reto de pintar mi primer pixel de color rojo LISTO !!!! 1) Nos vamos a una dirección de memoria desocupada 4000 2) Escribimos la instrucción 3E ( ld a, * ) de la sgte manera 3E 88, con esto estamos diciendo a AMSTRAD carga color rojo 10001000 (0x88) al registro A de la CPU 3) Escribimos la instrucción 32 ( ld (**),a ) de la sgte manera 32 00 C0 , con esto le decimos a AMSTRAD que copie lo que ya tenemos en el registro A de la CPU a la primera posición de memoria de vídeo que es la C000 (00 C0 en Little Endian(ordena los byte del menos significativo al mas significativo), C000 Big Endian(ordena los byte del mas significativo al menos significativo).(escuche a Fran la palabra "litleindian" y no concoia sobre esto y con esto complemente lo de la notación ( www.arumeinformatica.es/blog/los-formatos-big-endian-y-little-endian/#:~:text=Este%20formato%20es%20adoptado%20por%20la%20mayor%C3%ADa%20de%20procesadores%20Intel.&text=Decir%20que%20existen%20algunas%20arquitecturas,el%20nombre%20de%20Bi%2Dendian. ) 4) Escribimos la instrucción 18 (jr *) de la sgte manera 18 FE, con esto le decimos a AMSTRAD que salte (mueva el PC(program counter)) a la dirección de memoria FE. ¿Esto no logró comprender como FE = 4005 ? 5) y al final tenemos el programa de Fran 3E 88 32 00C0 18 FE (claro explicado como lo hace Fran, facilita todo. Lo reescribo para internalizarlo mejor.
Buen trabajo, José :). Continúa, que seguro que seguirás aprendiendo y mejorando mucho, y podrás hacer más y mejores cosas. Respecto a lo que preguntas, FE no es 4005, FE es -2. Lo explico en los vídeos, échales un vistazo. Lo que ocurre es que ese -2 se suma al PC, y si el PC está en 4007, entonces termina en 4005. Suerte, ánimo y a continuar :)
@@ProfesorRetroman siii, me di cuenta que mencionabas que era -2. Imagino que debe hacer una suma o resta, o la dar la vuelta del máximo FF y/o FE el resultado de la posición relativa queda en -2. Pero repasare de nuevo lo de binario y hexadecimal. Además que se disfruta viendo y estudiando esos vídeos, que te habré la imaginación para querer escribir más que un pixel. Gracias Fran!!! (Mikel Landa no termina de estar en forma en la Daufhine , para que sea un reemplazo natural de Alejandro Valverde. Esperemos arranque en el Tour 2020. 🚴
quiero que se muestre un pixel amarillo en la posicion 00 C0, por lo que entiendo seria asi: 3E 70 32 00 C0 18 FE 70 lo obtuve asi: Amarillo: 01 bit 7: 1 bit 6 al 0: 0 1 0 0 0 0 0 0 0 sumo solamente el primer 1 que seria la posicion "7" entonces: Amarillo sería 70 pero no me muestra lo que quiero. me muestra azul amarillo amarillo amarillo
Ah, si yo hubiese tenido estas explicaciones y estas herramientas en mis tiempos... Ahora con 53 años estoy empezando con su curso. Es genial. Muchas gracias por dedicarnos su tiempo.
Que hermoso compartir el conocimiento de una manera tan didactica! Increible haber encontrado tan buen curso y que ademas sea de la universidad de Alicante. Yo tome unos cursos de introduccion al desarrollo web de Sergio Lujan Mora de esta universidad.Ustedes son de lo mejor. Saludos de Argentina!!!🤩
Gracias profesor, estoy siguiendo su curso de ensamblador del Z80 , en los años 80, tecleaba en mi spectrum código máquina ,con la ilusión de descubrir y aprender lo que había detrás del código de mis juegos favoritos,aquella magia me atrapó y después de muchos años vuelvo al tema , gracias por sus clases, un Saludo
Eres lo maximo no tengo palabras para describirlo encontre lo que siempre estaba deseando muchas GRACIAS ojala hubiera mas gente como tu.
Qué guay, yo estudié letras y esto me parece fascinante! Me estoy metiendo poco a poco en el mundo del desarrollo web pero como soy curioso por naturaleza acabo viendo ensamblador xD. He visto varios vídeos suyos y coincido en que hay que entender el proceso de las cosas para ser mejor, aunque solo me dedicara a hacer páginas webs veo fundamental entender cómo funciona todo.
Muchas gracias por los vídeos, no deje de subirlos por favor!
El futuro de la educación. Muchas gracias por este excelente trabajo explicativo.
Me hubiese encantado tenerte como profesor cuando empece ingeniería técnica en informática de sistemas, me encantaba las asignaturas técnicas, pero mis maestros no eran tan pedagógicos como tu, y nunca aprendí ensamblador, solo en una sesión me has enseñado (Y lo he entendido) como funciona un programa a nivel de máquina. Tendría que haber más maestros tan altruistas como tu. Un saludo y ¡¡¡Muchísimas gracias!!!
Por primera vez en mi vida he entendido del todo un programa de código máquina. ¡Gracias mil!
Es una cantidad de trabajo impresionante y de alta calidad. Gracias Profesor
Muchísimas gracias por toda la información y el trabajo que estás haciendo! :)
Hola a todos.
Has hecho uno de mis sueños realidad: programar en ensamblador para mi añorado CPC6128.
Muchísimas gracias, Ronaldo.
Un Saludo.
esta 10/10, pero agunos que no estan relacionados no sabran de conceptos como yo pero me hice una idea despues de experimentar a base de prueba y error y me vine a reforzarlo aca,(por si no llegas a entender y sientes que quieres rendirte lee mi comentario si no te sientes asi vuelve a hacer lo que te dice el profe xd)
posdata: esto mas que nada son notas y conceptos que yo nombre o de pura casualidad sabia asi que no es explicacion de el video de el 1er reto, solo doy mis deducciones y pueden estar mal, tu debes sacar tus propias deducciones.
segun lo que practique, solo puedes usar las letras de A-F, y cualquier numero(el profesor te explica como se secciona el codigo por asi desirlo) y tiene 3 partes:
lo que copea un valor en la cpu, 3E (valor)
ubicacion donde se guarda 00C0
y otro que termina el programa(este es el video que nos presenta el codigo th-cam.com/video/NxI2kBarAhw/w-d-xo.html )
asi que solo vamos a tocar el valor y toda la ubicacion.
despues de tocar un rato el valor vez que solo puedes poner 2 digitos o 2 letras: 88 o AA o 8A (obvio no se especifica en esos valores).
todo el pad numerico esta permitido de 0-9 o de 1-0(segun teclado)
(todo exepto el siguiente punto lo deduje solo incluyendo lo de las separaciones y la funcion del codigo )
el cpu trabaja con valor exadecimal y el valor exadecimal es hasta el numero 16
y lo que para mi es lo mas inportante no debes ver el 88 como ochenta y ocho (aunque solo es para hacerte a una idea, habra ocaciones en las que me contradiga pero creo que facilita un poco el entendimiento)si no que como 8 y 8 no son 2 digitos si no que 2 numeros juntos, lo de el valor exhadecimal lo vi aqui ( este video pero voy a reenviar este mensaje a el comentario de el primer video th-cam.com/video/69aj0Vs8D8c/w-d-xo.html )
no puedes escribir 1616 en ensamblado proque seria algo completamente distinto a lo que quieres hace, si no que escribiras A en caso de 10 B en caso de 11 y asi(yo recomiendo ver el sistema hexadecimal despues de tocar un rato el codigo porque si siento que hace mucha falta)
todo lo que llevo de el curso esta muy bien asi que es un honor comentarlo y explicar unos puntos que me parecen importantes
comence a hacer este curso. gracias
Una pregunta la pila en z80 en que dirección de memoria empeiza el Stack pointer o el puntero de la pila
Vale, como no tengo muy claro en qué parte tienes más duda, te explico varias. Primero, la pila solo son datos en la memoria RAM y puede estar en cualquier parte de la RAM. No existe una zona reservada para la pila aparte del resto de la RAM, por así decirlo. De hecho, como digo en otros vídeos, "la pila no existe" :). Esto quiere decir que en realidad sólo es una forma conveniente de leer y escribir datos en la RAM siguiendo un orden.
Dicho esto, vamos con "donde está". Cuando se enciende un ordenador, sea cual sea, todas las memorias volátiles están a 0. Por tanto, los registros de la CPU, que son memorias volátiles igual que la RAM, están todos a 0. En particular, el registro SP (Stack Pointer) del Z80, estará a 0 también. Eso significa que "el tope de la pila estará en la posición 0" al comenzar. Como digo, esto no es "real". No hay nada en la RAM al comenzar y no hay zonas especiales de la RAM. Lo único que "da vida" a la pila es el registro SP y las instrucciones que usan ese registro (como PUSH, POP, CALL y RET). Si nunca usasemos una instrucción que dependa del valor de SP, "no habría ninguna pila" en memoria, porque nunca leeriamos ni escribiríamos en RAM donde dice SP.
Dicho esto, lo que ocurre al arrancar es que el Z800 empieza a leer de la memoria, en este caso de la ROM, empezando en la posición 0 (porque el registro PC está también a 0 al encender). Ahí, en ROM, está el código de arranque del firmware del Amstrad CPC. Y este código pone todas las cosas como le gusta al Firmware y al BASIC del CPC. En particular, cambia el valor de SP para ponerlo e C000, que es donde habitualmente lo en encontramos con la máquina funcionando.
Con todo esto, espero que entiendas que "la pila" no es más que un concepto, y que su técnica se reduce a una dirección de memoria indicada en SP y unas instrucciones de la CPU que leen y escriben en memoria teniendo en cuenta lo que dice SP. Si entiendes eso bien, seguro que podrás hacer muy buen uso de ello cuando lo necesites :)
Espero haber respondido tus dudas.
@@ProfesorRetroman si entiendo pero en la NES o el 6502 el Stack pointer está entre un rango de $0100 - $01FF por eso pensé que en el z80 sucedía lo mismo gracias por la respuesta
@@jhonbrayanangaritamedina1047 En el 6502 sucede eso porque el SP es de 8 bits, no de 16. Por eso, en realidad, el SP solo puede estar de 00 a FF. El hecho de situarlo en 01xx es una decisión de diseño, porque hay que añadir los 2 dígitos superiores para formar una dirección completa de memoria y el bloque 00xx se reserva en el 6502 para la página 0 de memoria (que hace como si fueran 256.registros virtuales). En este caso, SP empezará igualmente en 0, pero será 00 en vez de 0000 como en el Z80, porque solo tiene 8 bits.
Bien, ya tengo en que ocuparme.
Hola profesor, como puedo ver las clases de teoria que menciona?
Para este tipo de información, puedes acudir siempre a los links que tienes en las descripciones de este y de casi cualquier otro video :)
[Web del curso]: bit.ly/CursoDEZ80
[Grupo de Telegram]: t.me/asmz80
Espero que lo disfrutes
Un trabajo excelente Profesor. Me pregunto como puedo guardar el programa que tengo introducido en memoria en un archivo, para posteriormente cuando vuelva a ejecutar WinAPE, poder rescatar todo lo que he introducido. Gracias.
Gracias de nuevo por tus palabras.
Por si no lo has encontrado ya, la forma más fácil de guardar el programa en WinAPE es seleccionado la zona de memoria que quieres guardar en la ventana de volcado de memoria, pulsando botón derecho y eligiendo Save. Con eso guardas un fichero binario que contendrá exactamente lo que hayas seleccionado. Para volverlo a cargar, botón derecho sobre un byte de la memoria donde quieras cargarlo y eliges Load.
También puedes cortar y copiar lo que selecciones en el volcado de memoria con control+C, control+X y control+V, copiarlo a un editor de texto y de vuelta ahí. Eso puede ser cómodo a veces para programar.
Por último, puedes guardar snapshots, en el menú principal de WinAPE que son imágenes completas del estado de la máquina en un instante dado. Si los vuelves a cargar después, es como volver a iniciar la máquina exactamente como la dejaste para que continúe desde ese punto. Puede ser útil también.
@@ProfesorRetroman Muchas gracias Profesor. Sí, ya probé lo de selecciona las posiciones de memoria. Pero alguno de los aspecto que menciona en su respuesta no lo sabía. Genial :)
No se lo que es exactamente un "Snapshot" pero consultaré a Google. Gracias.
Muy buenas profesor, muchas gracias por enseñar de esta manera tan didáctica, ahora si le formulare las preguntas como corresponde.
winape es el emulador de Amstrad CPC verdad?
este lenguaje ensamblador es solo aplicable al z80 ??
Al iniciar el emulador sale una pantalla azul comienza con la frase "Amstrad Microcomputer (v4)", esa frase esta dibujada ahí ?
a que me refiero con dibujada , por ejemplo , no existe una variable que almacene esa palabra, esta siendo dibujada pixel por pixel en la memoria de video?
La memoria que vemos es ROM, RAM ?
es posible generar un archivo maquina desde C y cargarlo o escribirlo en la mapa de memoria del emulador de CPC?
Saludos profesor y disculpe si ya había respondido estas preguntas o si no formulo bien.
Correcto. WinAPE es un emulador de Amstrad CPC, y el lenguaje ensamblador que imparto en estas clases es específico del procesador Z80. Cada procesador tiene su propio conjunto de instrucciones, por tanto distinto código máquina y, a menudo, distinto ensamblador también.
Todo lo que se dibuja en pantalla tiene muchos procesos por debajo que terminan traduciéndose a píxeles, porque el haz de electrones del monitor dibuja píxeles. En Amstrad, esto se hace modificando la memoria de vídeo, que es la que se esta enviando al haz de electrones. Si se modifican los valores de esa parte de la RAM, cuando sea enviada de nuevo al monitor en el siguiente fotograma, los píxeles cambiarán. Para que se vean las letras, hay una serie de rutinas que están ya incluídas en el firmware de la máquina (en ROM), que son las que dibujan los píxeles adecuados para formar letras. Para hacerlo, en la ROM están guardadas las definiciones píxel a píxel de todos los caracteres y son las que se usan para dibujarlos en pantalla.
Es posible generar código máquina de cualquier manera. Puedes hacerlo a mano o escribir programas que los generen. El código máquina no es más que una secuencia de números, uno detrás de otro. Eso es muy facil de generar. Los compiladores traducen de C a ensamblador, y luego un progama ensamblador traduce de lenguaje ensamblador a código máquina, generando en un fichero la secuencia de bytes que es el código máquina. Después sólo hay que cargar esa secuencia en memoria, para poder ejecutarla. Y como ya te comenté anteriormente, hay compiladores de C que generan ensamblador Z80, como SDCC, que viene incluído en CPCtelera. Por tanto, este y otros compiladores, generan ensamblador Z8 como salida, que después se ensambla y genera un fichero binario en código máquina Z80. Cargando ese fichero en memoria en un Amstrad, el procesador puede ejecutarlo.
Hola Profesor, estoy siguiendo tu canal con mucho interés y voy a empezar como indicas con el emulador WinAPE, pero me surge la pregunta ¿puedo hacer lo mismo directamente sobre mi Amstrad CPC?
Muchas gracias por todo y enhorabuena por tu sabiduría.
Es una buena pregunta. La respuesta es técnicamente SI, pero prácticamente NO. Es decir, todo lo que hagas en el emulador funcionaría exactamente igual en una máquina real. El problema es que en la máquina real no dispones de un depurador para detener la máquina, ver la memoria, cambiar su contenido, saltar de un sitio a otro. La facilidad y versatilidad del emulador en este sentido es mucho mayor. Aún así, tienes formas de probar programas similares en la máquina real, claro que sí. Puedes introducir datos en posiciones de memoria desde BASIC con POKE, y puedes ejecutar lo que has introducido saltando a la posición inicial con CALL. Hay más formas, pero esta sería la más sencilla.
@@ProfesorRetroman De acuerdo probaré alguna cosilla en el Amstrad real, pero voy a descargarme el emulador y a seguir tus cursos con interés, tengo mucha ilusión por aprender, muchas gracias por todo.
te amo
Gracias por el curso, ya me gustaria ami asistir a tus clases :D. Estoy intentando seguirlo usando un cpc real, tambien voy viendo la teoria que me parece fascinante. He intentado hacer este ejercicio usando poke y peek del BASIC 1.1, pero aunque todos los valores Hex estan en su sitio en la RAM...4000 a 4006...al hacer un call 4000, el punto rojo aparece en un lugar aleatorio cada vez, incluso alguna vez me ha cambiado de color y/o forma, ademas el cpc se cuelga, no se si es por el bucle JR, pero no puedo hacer break. Alguna idea?
Como te indicaba en la respuesta a tu anterior comentario, es mejor que aprendas primero en el emulador y sigas el curso como está indicado. Si haces cosas distintas, puedes obtener resultados distintos, como en este caso. Además, como es el primer nivel del curso, no puedo explicar toda la teoría del CPC al completo antes de empezar a trabajar, ni puedo prever todas las cosas que se pueden hacer distintas a como propongo. Supongo que entiendes lo que quiero decir.
Al hacerlo en BASIC estarás introduciendo los comandos a mano, y provocando que la pantalla haga scroll vertical al llegar abajo. Cuando haces eso, el scroll cambia los parámetros de la memoria de vídeo (pues es un scroll por hardware). Esto hace que la posición C000 esté en otro sitio, porque se haya movido.
Tanto en el comentario anterior como en el vídeo explico que el programa termina con un bucle infinito. Eso significa que el ordenador se queda ahí colgado a propósito. Es parte de nuestro programa y la forma de evitar que continúe ejecutando otras cosas para poder ver lo que ha sucedido. En un CPC real, la única forma de salir de ahí es reiniciando.
Al igual que en mi respuesta anterior, te recomiendo que sigas el curso en el emulador para aprender mejor. Una vez hayas aprendido y domines la máquina, no tendrás problema en usar tus conocimientos en un CPC real para hacer lo que quieras.
Gracias por responder. Ya entiendo lo que quieres decir, lo tendre en cuenta. Mi objetivo es dominar el Z80 de cara a escribir un controlador de sonido para sega megadrive (que usa el z80 de co-procesador para controlar 2 chips de sonido). Asi que el cpc es perfecto para empezar por algo mas simple. Ah y disculpa por el anterior mensaje, lo escribi y lo borre rapido por que no lo tenia claro jaja.
Mi primer reto de pintar mi primer pixel de color rojo LISTO !!!!
1) Nos vamos a una dirección de memoria desocupada 4000
2) Escribimos la instrucción 3E ( ld a, * ) de la sgte manera 3E 88, con esto estamos diciendo a AMSTRAD carga color rojo 10001000 (0x88) al registro A de la CPU
3) Escribimos la instrucción 32 ( ld (**),a ) de la sgte manera 32 00 C0 , con esto le decimos a AMSTRAD que copie lo que ya tenemos en el registro A de la CPU a la primera posición de memoria de vídeo que es la C000 (00 C0 en Little Endian(ordena los byte del menos significativo al mas significativo), C000 Big Endian(ordena los byte del mas significativo al menos significativo).(escuche a Fran la palabra "litleindian" y no concoia sobre esto y con esto complemente lo de la notación ( www.arumeinformatica.es/blog/los-formatos-big-endian-y-little-endian/#:~:text=Este%20formato%20es%20adoptado%20por%20la%20mayor%C3%ADa%20de%20procesadores%20Intel.&text=Decir%20que%20existen%20algunas%20arquitecturas,el%20nombre%20de%20Bi%2Dendian. )
4) Escribimos la instrucción 18 (jr *) de la sgte manera 18 FE, con esto le decimos a AMSTRAD que salte (mueva el PC(program counter)) a la dirección de memoria FE.
¿Esto no logró comprender como FE = 4005 ?
5) y al final tenemos el programa de Fran 3E 88 32 00C0 18 FE (claro explicado como lo hace Fran, facilita todo. Lo reescribo para internalizarlo mejor.
Buen trabajo, José :). Continúa, que seguro que seguirás aprendiendo y mejorando mucho, y podrás hacer más y mejores cosas.
Respecto a lo que preguntas, FE no es 4005, FE es -2. Lo explico en los vídeos, échales un vistazo. Lo que ocurre es que ese -2 se suma al PC, y si el PC está en 4007, entonces termina en 4005.
Suerte, ánimo y a continuar :)
@@ProfesorRetroman siii, me di cuenta que mencionabas que era -2.
Imagino que debe hacer una suma o resta, o la dar la vuelta del máximo FF y/o FE el resultado de la posición relativa queda en -2. Pero repasare de nuevo lo de binario y hexadecimal.
Además que se disfruta viendo y estudiando esos vídeos, que te habré la imaginación para querer escribir más que un pixel. Gracias Fran!!! (Mikel Landa no termina de estar en forma en la Daufhine , para que sea un reemplazo natural de Alejandro Valverde. Esperemos arranque en el Tour 2020. 🚴
quiero que se muestre un pixel amarillo en la posicion 00 C0,
por lo que entiendo seria asi:
3E 70 32 00 C0 18 FE
70 lo obtuve asi:
Amarillo: 01
bit 7: 1
bit 6 al 0: 0
1 0 0 0 0 0 0 0
sumo solamente el primer 1 que seria la posicion "7"
entonces: Amarillo sería 70
pero no me muestra lo que quiero. me muestra
azul amarillo amarillo amarillo
Tienes que revisar conversión de binario a hexadecimal. 1000 en binario no es 7 en hexadecimal.