Z80 vs 6502/6510 vs 65C02

BlackHole
Mensajes: 843
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 5 veces
Agradecimiento recibido: 73 veces

Z80 vs 6502/6510 vs 65C02

Mensajepor BlackHole » 22 Feb 2016 15:06

Hola chicos,

Aunque programé 3 años para Commodore 64 (1988-1991), he dicho muchas veces por el foro que yo sigo prefiriendo mil veces el Z80 como procesador por su flexibilidad de registros y modos de direccionamiento. Fíjate que estos días estoy intentando apañar una rutina de descompresión de la conocida biblioteca aPLib de Joergen Ibsen, para utilizarla en Commodore 64 y me estoy volviendo loco. Literalmente. 25 años después, llevo 3 semanas y solo lo cojo a ratos perdidos, porque es frustrante adaptar un algoritmo tan complejo que apenas entiendo, a un procesador que no te deja hacer nada de nada. Y eso que parto de una rutina ya hecha para el 65C02 del Apple IIc creyendo que sería compatible con el 6502 normal... iluso de mí.

El 65C02 te deja hacer saltos relativos cortos con BRA (branch) directamente, instrucción que no existe en 6502 donde solo lo puedes hacer tras comparaciones con las banderas de acarreo (BCC, BCS), bandera de cero (BNE, BEQ), bandera de desbordamiento (BVC, BVS) y bandera de negativo (BMI, BPL). Fastidia si quieres hacer código relocalizable en 6502, porque salvo que conozcas o fuerces el valor de una bandera, acabas teniendo que programar un salto JMP absoluto y no relativo. También en 65C02 puedes poner a cero una posición de memoria sin tener que modificar antes un registro (A,X,Y) y transferirlo, e interesantes instrucciones de manipulación de bits (seteo, reseteo y consulta) sin necesitar copiar a acumulador y revisar con instrucciones lógicas (AND, OR) en forma de máscara.

Pero las cosas del 6502 que más me desquician y que sí fueron añadidas en el 65C02, que no puedo usar en el Commodore 64:

- Para 3 míseros registros de 8 bits que tienes (A,X,Y) no puedes meter X o Y en la pila, solo el acumulador A.
- Puedes incrementar y decrementar los registros índice X e Y, pero no puedes incrementar o decrementar de manera inmediata el acumulador A.
Debes hacer una suma o resta ajustando previamente la bandera de acarreo que podría estar controlando una operación anterior. No existen sumas o restas sin acarreo.
- No puedes hacer operaciones indirectas con un puntero en página cero sin depender del índice Y, que debes salvar antes (sin pila) y poner a cero para hacer el cálculo.

No me extraña que ante tanta deficiencia en ese último modo de direccionamiento indirecto, el C64, Atari u Oric acabasen plagados con código automodificable en los movimientos grandes de bloques de datos. Pongo un ejemplo de una simple instrucción para mover un byte de un lado a otro, encontrada en las rutinas de descompresión de aPLib para otros procesadores diferentes.

Elegancia en el Z80, que aún siendo un procesador de 8 bits, tiene 10 registros de 16 bits:

Código: Seleccionar todo

LD HL,origen
LD DE,destino
...
LDI <----- ya está, una única instrucción de 2 bytes y 16 ciclos que equivale a [DE]=[HL],HL++,DE++,BC--

Elegancia absoluta también en 68000, lógico siendo un procesador de 16 bits con registros de 32 bits:

Código: Seleccionar todo

lea origen,A0
lea destino, A1
...
move.b  (a0)+,(a1)+ <---- lo mismo, mueve un byte y postincrementa sin necesitar comodines intermedios

Sin embargo, la locura absoluta en 6502 por no tener registros puros de 16 bits:

Código: Seleccionar todo

   LDA   #origen_low <---- los 8 bits bajos de una dirección de 16 bits
   STA   puntero_origen
   LDA   #origen_high <---- los 8 bits altos de una dirección de 16 bits
   STA   puntero_origen+1
   LDA   #destino_low
   STA   puntero_destino
   LDA   #destino_high
   STA   puntero_destino+1
   ...
   PHA
   TYA
   PHA
   LDY   #$00
   LDA   (puntero_origen),Y
   STA   (puntero_destino),Y
   INC   puntero_origen
   BNE   +
   INC   puntero_origen+1
+  INC   puntero_destino
   BNE   ++
   INC   puntero_destino+1
++ PLA
   TAY
   PLA

Por eso a la gente que programa en 6502 como nuestro compañero Explorer en el Atari o Chema en el Oric (que por cierto, tiene mañana una Bola Extra sobre Oric en el programa Amiga Wave en YouTube), es para quitarse el sombrero... yo nunca tuve la paciencia de hacer cosas complejas en C64, y eso que crackeaba, ripeaba músicas y hacía intros con scroll y logos moviéndose. Será que era más joven.

Avatar de Usuario
explorer
Mensajes: 142
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 3 veces
Agradecimiento recibido: 118 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor explorer » 22 Feb 2016 16:56

Hola, BlackHole.

En efecto, programar para el 6502 se hacía muy tedioso, así que estabas casi obligado a tener un buen ensamblador y conocerte los opcodes al dedillo.

El Commodore 64 lleva un 6510, mientras que los Atari XL/XE llevan un 6502C (alias, Sally) (no confundir con el 65C02).

En estos momentos... no soy capaz de recordar si en mis programas usé alguna vez un BRA. Según lo que veo por Internet, en caso de querer hacer un salto así con un 6502, se recomendaba usar el flag V (ya que solo se modifica en sumas y restas):

CLV
BVC LABEL

pero... yo juraría que nunca tuve que hacer algo así, y que siempre usé BRA... pero eso no concuerda con lo que estoy viendo ahora. O quizás es que siempre usaba el resto de saltos Bxx, para cerrar los bucles o por ejecución de las condiciones. No lo sé.

Estos micros son para lo que son. Están limitados por la tecnología de la época. Pero eso no quiere decir que no sean interesantes: no veas la cara que puse cuando descubrí que mi monitor Philips lleva un 6502 integrado en el SoC controlador, para la generación de los menús que aparecen en pantalla.

Y... lo más sorprendente: están haciendo un sistema operativo gráfico para los Atari 8 bit, similar al GEOS de C64.

Así que, si es posible escribir un sistema operativo multitarea en el 6502, tú también puedes escribir tu algoritmo. Llevará tiempo, pero se podrá ;)

Avatar de Usuario
ron
Mensajes: 17865
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 856 veces
Agradecimiento recibido: 912 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor ron » 22 Feb 2016 16:56

Aparte de viejos... la memoria, que también tiene sus lagunas.

El microprocesador 65C02 es una versión mejorada del microprocesador "CMOS" MOS Technology 6502 de 8 bit. Ha sido fabricado durante años por Western Design Center, NCR, GTE, Rockwell, Synertek y Sanyo. Es compatible electrónicamente con el 6502 y ofrece un menor consumo de potencia debido al uso de la tecnología CMOS. Hay que tener en cuenta que dependiendo del fabricante incorpora algunas instrucciones más o no. Ha de ser tenido en cuenta.

Lo más interesante respecto al 6502 original es que soporta nuevas instrucciones. Brevemente, las características son:

Un nuevo modo de direccionamiento zero page para ADC, AND, CMP, EOR, LDA ORA, SBC, e instrucciones STA.
Nuevo acumulador DEC e instrucciones INC
JMP ( abs,X ) modo de direccionamiento
BRA (branch always) instrucción
PHX PHY PLX PLY ( push ó pull X ó Y register )
STZ ( store zero ) instrucción
TRB ( test y reset bits ) instrucción
TSB ( test y set bits ) instrucciónes


Cuatro instrucciones adicionales están disponibles en los 65C02 fabricados por Rockwell y WDC:

BBR BBS ( branch on bit reset or set )
RMB SMB ( reset or set memory bit )


Dos instrucciones adicionales están disponibles en los 65C02 fabricados por WDC:

STP ( stop the processor )
WAI ( wait for interrupt )


Cualquier código de operación ( OPCODE ) no utilizado se maneja como NOP por el 65C02 ( con el 6502 el comportamiento creo que está indocumentado ).

El 65C02 continuará ejecutando todo el código nativo 6502 existente pero también se puede experimentar con las nuevas instrucciones 65C02. Esta CPU también consumirá menos energía y generará menos calor.

Así que a leer:

http://www.6502.org/tutorials/65c02opcodes.html
http://patpend.net/technical/6502/6502ref.html
http://www.llx.com/~nparker/a2/opcodes.html

Si no te he entendido mal, tengo la impresión que todo el problema que se plantea es por los OPCODES.

Avatar de Usuario
Silicebit
Mensajes: 1404
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 53 veces
Agradecimiento recibido: 128 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor Silicebit » 22 Feb 2016 19:31

Debes tener en cuenta que el 6502 es casi un RISC con cierta arquitectura pipeline, de ahí su escaso conjunto de instrucciones. En cuanto al número de registros... Podrían haber sido más, es cierto, pero el 6502 es un microprocesador orientado hacia la memoria, tienes 256 registros en la página cero, con un tiempo de acceso ultrarápido, puede escribir y leer un dato en la página cero en tan sólo 3 ciclos de reloj, si el 6502 trabaja a 1MHz, entonces el tiempo es de 3uS. 8-)

Los saltos relativos para código reubicable los soluciono sabiendo en todo momento como va a quedar el registro de estado, y apoyándome en la bandera que más me interese, si no, como ha dicho explorer, forzando una bandera y usando el salto que se apoya en ella. Yo he utilizado mucho el SEC y BCS o CLC y BCC.

Las nuevas instrucciones en el 65C02 son una bendición y de verdad que le hacían falta.

En la rutina del 6502 el uso de INC es un poco chapucero, teniéndo el registro Y como índice. Una rutina típica para mover bloques de datos sería:

Código: Seleccionar todo

     LDA   #origen_low <---- los 8 bits bajos de una dirección de 16 bits
     STA   puntero_origen
     LDA   #origen_high <---- los 8 bits altos de una dirección de 16 bits
     STA   puntero_origen+1
     LDA   #destino_low
     STA   puntero_destino
     LDA   #destino_high
     STA   puntero_destino+1
     LDY #$00
BCL1 LDA (puntero origen),Y
     STA (puntero destino),Y
     CPY #dirección final low ambos punteros
     BEQ BCL2
BCL3 INY
     BNE BCL1
     INC #destino_high
     INC #origen_high
     BNE BCL1
BCL2 LDA puntero_origen+1
     CMP #valor final puntero origen high  comprobamos dirección final basándonos en el puntero origen.
     BNE BCL3
     ...
     ...
     ...

Western Design Center (WDC) aún sigue fabricando el 65C02 y toda la familia 65XX (65C21, 65C22, 65C51) y el 65816.
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

BlackHole
Mensajes: 843
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 5 veces
Agradecimiento recibido: 73 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor BlackHole » 22 Feb 2016 21:24

Silicebit: El problema que me estoy encontrando aquí no es mover un bloque grande de una sola vez, donde me importaría muy poco gastar unos bytes de más e ignorar los valores previos del registro Y, sino que se trata de una rutina de descompresión que puede pasar por un determinado algoritmo varias decenas de miles de veces, pero que realmente solo mueve 1 byte cada vez, resultado de otras operaciones anteriores (decodificación de secuencias o referencias a datos previos dentro de la ventana de desplazamiento) y encima el registro Y es utilizado para otras cosas y debo preservarlo. Tengo que averiguar para qué se usa, por si acaso pudiese usar una dirección de página cero en su lugar e ignorarlo. Su preservación supone hasta el 10% del tiempo de CPU malgastado.

Ando intentando afinar poco a poco las rutinas y cada instrucción que me ahorro se traduce en casi 100.000 ciclos de reloj, dependiendo de lo crucial que sea. Lamentablemente para 6502 hay pocos editores y emuladores y al contrario que para Z80 donde hay diversas herramientas que ofrecen estadísticas de ejecución para saber dónde están los cuellos de botella, para 6502 no conozco ninguna y voy poniendo "stopwatch" en el VICE completamente a mano. Descomprimir el fichero con el que ando probando ahora son 9.2 millones de ciclos (y voy afinando, que al principio eran más de 11.6 millones).

Pero si en Spectrum aPLib es mucho más rápido que Exomizer, aquí tengo que conseguirlo por cojones... aunque desenrolle todos los bucles.

Avatar de Usuario
Silicebit
Mensajes: 1404
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 53 veces
Agradecimiento recibido: 128 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor Silicebit » 22 Feb 2016 21:48

Para mí, uno de los mejores editores/ensambladores para el C64 y el 128 es Merlin, es el que suelo usar. Tengo por ahí un cronómetro que te dice el número de ciclos que gasta una rutina, creo que lo tengo en algún disco, déjame mirar a ver si lo encuentro.
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

Avatar de Usuario
Silicebit
Mensajes: 1404
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 53 veces
Agradecimiento recibido: 128 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor Silicebit » 22 Feb 2016 23:12

El cronómetro lo tecleé de la revista Commodore World y es cortito. Le puedes echar un vistazo descargándote la revista en formato pdf de aquí: http://retroinvaders.com/es/revista/com ... d-38/12099 número 38, página 6.

Si encuentro el disco con él, te paso la imagen.
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

Avatar de Usuario
luiscoco
Mensajes: 2337
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 34 veces
Agradecimiento recibido: 46 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor luiscoco » 22 Feb 2016 23:23

Ron q bueno verte bien
Pues blackhole si ves el 6809 te morirás de envidia, con decirte que hace cosas directas a memoria que ni el z80 hace y que a pesar de ser de 8 bits casi todo es a 16 bits, q tiene un push de todos los registros en 8 ciclos y q a pesar de ir a 1 o 2 Mhz le gana en tiempo y ciclos a todos

Avatar de Usuario
Chema
Mensajes: 1854
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 928 veces
Agradecimiento recibido: 326 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor Chema » 22 Feb 2016 23:29

Si preservas Y en una dirección de página cero en lugar de usar la pila, te ahorras unos ciclos (se queda en 6 en total frente a las 10 usando la pila, si no me equivoco). Usando codigo auto modificable sale igual, aunque te ahorras una dirección de página cero.

Pero vamos, que de usar codigo auto modificable lo usas en el lda/sta y te ahorras todo.

Avatar de Usuario
ron
Mensajes: 17865
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 856 veces
Agradecimiento recibido: 912 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor ron » 23 Feb 2016 13:52

Mis dos céntimos, muchos emuladores de micros con 65C02 llevan debugger y desensamblador. Ayer anoté estas URL que me parecieron más que interesantes, échales un ojo a ver si encuentras lo que quieres.

http://wiki.nesdev.com/w/images/7/76/Programmanual.pdf

http://e-spacio.uned.es/fez/eserv/taee: ... /S2A02.pdf

http://www.sbprojects.com/sbasm/6502.php

http://patpend.net/technical/6502/6502ref.html

http://www.dwheeler.com/6502/oneelkruns/asm1step.html

BlackHole
Mensajes: 843
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 5 veces
Agradecimiento recibido: 73 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor BlackHole » 23 Feb 2016 14:02

Gracias ron, pero la máquina donde necesito desarrollar es el C64, no el Apple IIc. Uso VICE para emular, pero el debugger (aunque muy bueno) no es perfecto.

No es 65C02 el que necesito correr, sino 6502 a secas (el 6510 del C64 comparte su código, solo se diferencia en los puertos I/O que permiten mapear dispositivos y memoria).
La rutina de 65C02 en la que me estaba basando ya está portada a 6502 estándar y ando intentando optimizarla. El hilo solo era una queja de lo capado que está el procesador del C64.

No te preocupes, como aconsejó Chema voy a tener que tirar por la calle del código automodificable, pero el assembler que usaba hasta ahora (WLA DX) no me deja.
Solo es cuestión de buscar otro ensamblador o IDE. Me han hablado de ACME y del PRG Studio. Son dos herramientas que intentaré probar este finde. Gracias.

Avatar de Usuario
Silicebit
Mensajes: 1404
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 53 veces
Agradecimiento recibido: 128 veces
Contactar:

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor Silicebit » 23 Feb 2016 15:07

Mira también C64 Kickass IDE: http://csdb.dk/release/index.php?id=104482
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

Avatar de Usuario
groovydrifter
Mensajes: 1298
Registrado: 31 Ago 2014 21:07
Ubicación: Mañolandia
Agradecido : 51 veces
Agradecimiento recibido: 35 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor groovydrifter » 08 Mar 2016 04:08

Incluso sacarte una lista de opcodes ilegales, puedes ahorrarte ciclos ahí tambien no?
-flirt Shut up and deal... (The Apartment, Billy Wilder, 1960)

BlackHole
Mensajes: 843
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 5 veces
Agradecimiento recibido: 73 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor BlackHole » 08 Mar 2016 14:50

Lo miré en su día un rato... para que pudiese juntar dos instrucciones en una o modificar una bandera que sirviese, o algo así... pero no encontré nada que me fuese útil en el código.

De todas formas, estas dos semanas no he podido hacer nada. Estoy muy ocupado con mis deberes de coreano, que lo tengo olvidado.

jltursan
Mensajes: 2197
Registrado: 20 Sep 2011 13:59
Agradecido : 101 veces
Agradecimiento recibido: 270 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor jltursan » 08 Mar 2016 20:25

!

Avatar de Usuario
ron
Mensajes: 17865
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 856 veces
Agradecimiento recibido: 912 veces

Re: Z80 vs 6502/6510 vs 65C02

Mensajepor ron » 08 Mar 2016 22:48

juasjuasjuas, que valor le dice... solo por curiosidad lo he mirado, jl eres un crack


Volver a “Commodore 8 Bits”

¿Quién está conectado?

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