Autor Tema: Dudas en Ensamblador  (Leído 120479 veces)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #165 en: Junio 29, 2015, 09:53:33 »
  Bueno ya estoy de vacaciones osea que me vereis mas activo por aqui y sobre todo por éste hilo,..como os conte para crear texto los hacia cargando letra por letra en el acumulador el texto y eso me suponia un gasto de bytes tremendo...

Código: [Seleccionar]
*=$0801 ; INICIA PROGRAMA EN ESA POSICION
.WORD NEXT,10 ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA
.NULL $9E,^START ; "SYS START" (START=INIT M.C.)
NEXT .WORD 0 ; FIN BASIC
START ;SEI HABILITA INTERRUPCIONES (SEI, DESABILITA)

; RUTINA ESCRIBIR TEXTO
LDX #0
BUCLE
LDA TEXTO,X ; CARGA A CON EL VALOR DEL TEXTO Y SIGUIENTES
JSR $FFD2 ; SALTA A RUTINA EN ROM SACA A PANTALLA CARACTER ASCII
INX ; INCREMENTA EL VALOR DE X
CPX #13 ; COMPARA VALOR DE X CON 13 QUE ES FINAL DE TEXTO
BNE BUCLE ; SI NO ES ASI VUELVE AL BUCLE
FIN
JMP FIN

TEXTO .TEXT"HOLA A TODOS."

   He estado probando esta rutina que os adjunto y me funciona perfecta,..solo me falta por saber como hago para que el texto aparezca en el punto que yo quiero en pantalla, vamos la posicion de memoria de pantalla que yo elija

   Haciendo los textos asi, por cadenas de caracteres el ahorro va a ser bestial,..ahora estoy en plan de reducir el listado al maximo..

  Me contais y saludos.
   

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #166 en: Junio 29, 2015, 12:38:44 »
Creo recordar que habian un par de pokes para esto.
Tengo una libreta con pokes útiles anotados. Lo miraré cuando llegue a casa.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11379
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #167 en: Junio 29, 2015, 16:10:29 »
Según parece hay que ubicar el cursor donde se quiere imprimir.

Quizás esto sirva (no lo he probado)

Código: [Seleccionar]
1000 poke 780,0
1010 poke 781,row
1020 poke 782,col
1030 sys 65520

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #168 en: Junio 29, 2015, 16:37:21 »
Según parece hay que ubicar el cursor donde se quiere imprimir.

Quizás esto sirva (no lo he probado)

Código: [Seleccionar]
1000 poke 780,0
1010 poke 781,row
1020 poke 782,col
1030 sys 65520

Eso funciona incluso sin el 780,0. Probado en VICE.
Pero creo que tengo algo mas sencillo por casa. Lo buscare
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #169 en: Junio 29, 2015, 20:58:23 »
No era lo que creia.

POKE 214,x

Pone el cursor en la linea x pero no sirve para los print.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #170 en: Junio 29, 2015, 21:23:54 »
Esta manera es algo mas corta y sin bucles que te ralenticen el programa.

Código: [Seleccionar]
         *= $1000   /Inicio codigo  sys4096

         ldx #$00  /Lobyte direccion del texto
         stx $22    /Almacenado
         ldx #$50 /Hibyte
         stx $23   /Almacenado
         lda #$0A /Cantidad de caracteres a mostrar
         jsr $ab24 / Rutina mostrar texto
         rts            /Salir a basic

         *= $5000     /Zona de memoria donde almacenar el texto.
        .text "hola majos"
-----------------------------------------------------------
turbo macro pro v1.2            by style
« última modificación: Junio 29, 2015, 21:26:56 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 535
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #171 en: Junio 30, 2015, 04:43:28 »
A esta altura deberias haberte leido las rutinas del kernal, ya que ahi esta todo el sistema operativo, las rutinas para leer y grabar en dispositivos como impresoras y disketeras, tambien la impresion en pantalla, la lectura del teclado, y lo interesante es que esas rutinas son compatibles con otros modelos de Commodore, estan en las mismas direcciones en todos los modelos.
No tengo ahora a mano el manual pero creo que para esa rutina habia por lo menos una que permite colocar el cursor en la fila y columna que elijas, y otra que te devuelve la fila y columna actual.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #172 en: Julio 01, 2015, 00:46:59 »
  Mañana voy a salir del Claustro y le voy a incluir a la pantalla un Limpiado y colores de fondo negros a ver donde me muestra el texto y a partir de ahi a ver que le incluyo a la rutina para que me muestre el texto donde yo quiero...

  Que conste que yo ya se mostrar cualquier char en cualquier punto de la pantalla que yo quiero pero ahora creo que estamos hablando de una cadena de chars (caracteres) la historia es donde posicionar el inicio de la cadena, supongo,...yo pregunto porque no se como hacerlo y cualquier resolucion es bienvenida,...mañana hablamos...

 Chao.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #173 en: Julio 01, 2015, 00:49:09 »
A esta altura deberias haberte leido las rutinas del kernal, ya que ahi esta todo el sistema operativo,

  No se si las tendre o no o si las habré leido o no,..ya sabeis que soy un desastre, en cualquier caso si me las puedes adjuntar por aquí,.nunca vienen mal...

  Saludos

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 535
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #174 en: Julio 01, 2015, 02:00:20 »
Lo decia porque sigues un camino un tanto inusual, te has salteado algunos pasos en tu incursion en la programacion en ensamblador, normalmente lo primero que se aprende despues de las instrucciones del 6502 son las rutinas de la ROM, lo que vendria a ser la "BIOS" del C64.
En la mayoria de los ordenadores el uso es similar, se definen dispositivos asignandoles un numero, algunos son de entrada, otros de salida y otros de entrada/salida, un ejemplo de dispositivo de entrada es el teclado, de salida la pantalla, y de entrada/salida todo lo que tiene que ver con el almacenamiento. En los Commodore (PET, C16, Plus/4, C128, C64, etc.) se usa la rutina OPEN para abrir un canal hacia un dispositivo (que puede ser el teclado o la pantalla tambien), y luego hay rutinas para enviar o recibir un byte, dependiendo del dispositivo del cual se trate, se requerira llamar a otras rutinas antes de OPEN, por ejemplo si es un dispositivo de E/S hay que llamar a una rutina para especificar el nombre del archivo. Si se quiere enviar un comando a la disketera, como por ejemplo para formatear un diskette, se usa la cadena de comandos como si fuera el nombre de archivo.
Usando el numero de dispositivo de la pantalla se puede imprimir con esas mismas rutinas genericas, pero la que usaste es una rutina que enmascara todo eso y va directamente a la pantalla, aunque por debajo use las genericas.
Lo bueno de las rutinas genericas es que aprendiendo como usarlas luego haces de todo con casi el mismo codigo, solo cambiando la forma en que las usas.
Hice una busqueda rapida y aqui sale algo de las rutinas, un poco resumido:
https://www.c64-wiki.com/index.php/Kernal
Aqui detalla un poco mas el uso de cada rutina:
http://sta.c64.org/cbm64krnfunc.html
En el caso especifico de la posicion del cursor (la rutina que usaste, CHROUT, que tiene el vector de entrada en $FFD2 en todos los modelos de Commodore, imprime en la posicion actual del cursor), se ajusta o se lee usando la rutina PLOT:
PLOT   $FFF0   65520   Set or retrieve cursor location
https://www.c64-wiki.com/index.php/PLOT
Lo que no recuerdo es que registro contiene la fila y cual la columna, en esos dos sitios dice exactamente lo contrario en cada uno, ese ultimo que puse dice que X contiene la fila e Y la columna, el otro dice lo contrario, y me parece mas logico, X: columna, Y: fila.
"$FFF0   PLOT. Save or restore cursor position.
Input: Carry: 0 = Restore from input, 1 = Save to output; X = Cursor column (if Carry = 0); Y = Cursor row (if Carry = 0).
Output: X = Cursor column (if Carry = 1); Y = Cursor row (if Carry = 1).
Used registers: X, Y.
Real address: $E50A."
Justo antes de llamar a PLOT necesitas ajustar el valor de CARRY, en eso coinciden los dos sitios, si CARRY=0, al llamar a la rutina lees la posicion actual del cursor, que se carga en X e Y, si CARRY=1, necesitas cargar X e Y previamente con columnas y filas validas, y al llamar a PLOT deberia cambiarse la posicion del cursor usado por CHROUT.
Estuve buscando y no los encontre escaneados, pero puede ser que esten en alguna parte, si los encuentras te recomiendo estos libros, no son muy extensos pero tienen buena informacion, solo tengo el ultimo, el primero debe ser mas interesante en tu caso porque trata de graficos y sonido. En este tema de retrocomputacion se hablo de estos libros: http://www.retrocomputacion.com/e107_plugins/forum/forum_viewtopic.php?34771
Fijate que trae una tabla (la segunda foto que aparece) donde se explica bien el uso de cada rutina de la ROM.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #175 en: Julio 01, 2015, 09:19:17 »
Es lo quiene no saber. Tienes un problema y lo solucionas como puedes, no como dereria ser.

Si yo os contara las peripecias que hacia con el monitor del FC3 y el desconocimiento... seguro que me excomulgabais  ;D

Me gusta la explicación, me la apunto para probar. Tengo ganas de volver a programar con mi pequeñajo.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #176 en: Julio 03, 2015, 10:05:34 »
  Atencion,...he visto esta rutina que  creo que puede darnos con la solucion de mostrar un texto en el punto de pantalla que queremos,...no la he probado pero pinta bien,...luego os cuento,..aqui la dejo para que la vayais echando un vistazo:

Código: [Seleccionar]
* = $1000 ; SYS 4096.
  LDX #$01 ; Carga X con #$01, que corresponde a la línea 1.
  LDY #$0A ; Carga el Y #$0A, que corresponde a la columna 10.
  JSR $E50C ; Salta a la subrutina en ROM $E50C, que sitúa el cursor en las coordenadas dadas en los valores de X e Y.
  LDA #<CADENA ; Carga A con el byte bajo de la posición donde empieza el texto.
  LDY #>CADENA ; Carga Y con el byte alto de la posición donde empieza el texto.
  JSR $AB1E ; Salta a la subrutina en ROM $AB1E, que imprime una cadena de caracteres.
  RTS ; Retorna al BASIC.
CADENA .TEXT "HOLA A TODOS!!!" ; Texto.
  .BYTE $00

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #177 en: Julio 03, 2015, 13:11:59 »
   Bueno, asunto solucionado,...he probado la rutina y va perfecta, ahora ya se colocar el texto donde yo quiero simplemente modificando estas dos lineas donde defino Fila y Columna...

     
Código: [Seleccionar]
        LDX #$01 ; Carga X con #$01, que corresponde a la línea 1.
  LDY #$0A ; Carga el Y #$0A, que corresponde a la columna 10.

   Ahora estoy en plan de reducir el listado como sea ya que se me habia ido a 33 Kb derrochando como un loco,...de hecho en un primer repaso he conseguido reducir el listado en 3 Kb (3000 Bytes, es es mucho en ensamblador),...haciendo simplemente esto que cuento....

  Utilizo muchos bucles para mostrar, dar, quitar, etc, etc colores, chars, lo que sea,...antes hacia un bucle para cada cosa situando el acumulador fuera del bucle que opera en ese momento,...asi:

   
Código: [Seleccionar]
;
        LDA #$A0          ; CARGA PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
LDX #0 ; CARGA VALOR
BUCLE434          ; INICIO DE BUCLE
LDA #$A0         ; PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
STA $590,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $5B8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
INX
CPX #40 ; TOPE DE ESPACIO
BNE BUCLE434 ; SI NO ES IGUAL VUELVE A BUCLE

        CONTINUA.....

  Si incluyo el acumulador dentro del bucle antes de la posicion de memoria a la que actuara,...me encuentro que puedo meter muchos acumuladores y en un mismo bucle poner char, colores, lo que quiera, economizando rutinas completas de bucles (que antes hacia para cada cosa) por un tubo y la reduccion de bytes es tremenda...aqui como queda la misma rutina ampliandola para que haga mas cosas utilizando solo un bucle...

       
Código: [Seleccionar]
LDX #0 ; CARGA VALOR
BUCLE434 ; INICIO DE BUCLE
LDA #$A0 ; PRIMER CHAR DE ASFALTO SEGUNDO ANDEN
STA $590,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $5B8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$E8 ; PRIMER CHAR DE BORDILLO LEJANO
STA $5E0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$70 ; PRIMER CHAR PARED MURO FONDO ESTACION
STA $608,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $630,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $4F0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $518,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $540,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $568,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$C0 ; PRIMER CHAR SUELO DE RAILES
STA $658,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6D0,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
LDA #$94 ; PRIMER CHAR RAILES TREN
STA $680,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6A8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
STA $6F8,X ; APLICA A POSICION DE VIDEO MAS ESPACIO
INX
CPX #40 ; TOPE DE ESPACIO
BNE BUCLE434 ; SI NO ES IGUAL VUELVE A BUCLE

        CONTINUA.....

  Como os conte yo para montar los textos hacia letra por letra en el acumulador y eso me gasta mogollo n de bytes,...fijaros que forma mas brusca de hacerlos por ejemplo para poner la palabra "final" a partir de la posicion $5EC...

     
Código: [Seleccionar]
        JSR FF ; F
STA $5EC ; VIDEO MEMORY
JSR II ; I
STA $5ED ; VIDEO MEMORY
JSR NN ; N
STA $5EE ; VIDEO MEMORY
JSR AA ; A
STA $5EF ; VIDEO MEMORY
JSR LL ; L
STA $5F0 ; VIDEO MEMORY

  JSR II, JSR AA, etc, etc, son subrutinas en las que se carga el valor del caracter),...pero como veis es tortuorio hacer un texto y su derroche,...el utilizar la rutina que hablabamos de poder un texto con una cadena de caracteres y en la posicion que uno quiera era muy importante para mi y un nuevo paso que tenia que mejorar y que creo que me puede suponer otros 3 Kb de ahorro, ya que os podeis imaginar el despelote de bytes que de esa forma consume los textos de un juego o en el momento que tenga muchos textos....

  Todo eso ahora lo soluciono y reduzco de un plumazo con la rutina que nos traia a cuentas...

   
Código: [Seleccionar]
        LDX #$01              ;CARGA LINEA EN X
  LDY #$0A              ; CARGA COLUMNA EN Y
  JSR $E50C
  LDA #<CADENA
  LDY #>CADENA
  JSR $AB1E
  CONTINUA...

CADENA .TEXT "HOLA A TODOS!!!"
  .BYTE $00

   Saludos
« última modificación: Julio 03, 2015, 13:38:57 por R. INTERNATIONAL »

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 535
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #178 en: Julio 03, 2015, 16:30:35 »
$E50C seguramente es la misma rutina que puse al final, no mire el desensamblado de la ROM pero probablemente esta entrando directo saltandose la parte en que chequea el valor de CARRY para decidir si lees o ajustas la posicion del cursor, porque la entrada original es $E50A. La entrada correcta (para que sea compatible con todos los modelos de Commodore) seria $FFF0, pero como esta ROM no tiene una rutina para imprimir un cadena, y estas usando una del BASIC, no tiene mucho sentido mantener compatibilidad, ya que el BASIC difiere en los distintos modelos.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #179 en: Julio 03, 2015, 20:51:37 »
Me encanta este hilo.

Es la primera vez que veo competiciones entre hombres hechos y derechos sobre quién la tiene más corta pero funcional  (la rutina mal pensados).

Esto es lo que me gusta y lo que más me hacia/hace disfrutar, el aprender ensamblador y a usar la ROM para aprovechar los recursos de nuestros cacharrillos al máximo .

Estoy usando CBM prg Studio y me parece excelente y muy simple de usar. Puñaladas por usarlo a:
nostoy@gmail.com;D

Muchisimas gracias por colgar estas rutinas (por mi no pareis  ;) ).
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.