Autor Tema: Rutinas en CM mas o menos útiles  (Leído 26580 veces)

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Rutinas en CM mas o menos útiles
« en: Julio 08, 2015, 00:49:44 »
Buenas.

Como veo interes en aprender ensamblador (yo el que mas) , ire colgando por aquí las rutinas
que en su dia aprendí o me enseñaron. "Trasteocódigos" los llamaba (era un crio).

Me encantaria crear una colección con los aportes de todos para tener un lugar de consulta rápida ante esos momentos "¿y ahora como demonios hago esto?" .

Aqui van mis primeros aportes. Utilizo la ROM del basic para las operaciones. Ya se que no es lo mas rápido, pero la facilidad de uso ayudará (o eso espero) a los noveles como yo.
___________________________________________________________________________________
Este permite hacer calculos de 16bit. y los muestra en pantalla. Suma, resta, divide y multiplica enteros.
Muy útil para manejarse en la memoria de pantalla usando coordenadas por ejemplo.

Código: [Seleccionar]
;Creado en CBM prg Studio
; 10 SYS (4096)

*=$801


        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $34, $30, $39, $36, $29, $00, $00, $00

        *=$1000         ;inicio programa

facarg=$bc0c
intfac=$b391
sum=$b86a
res=$b853
mul=$ba2b
div=$bb12                       
facind=$bc9b
intasc=$bdcd

        lda #$01        ;hibyte 1ª cifra a calcular
        ldy #$18        ;lobyte 1ª cifra a calcular
        jsr intfac        ;
        jsr facarg       ;
        lda #$04        ;hibyte 2ª cifra a calcular
        ldy #$00        ;lobyte 2ª cifra a calcular
        jsr intfac       ;
        jsr sum         ;OPERACION ELEGIDA
        jsr facind      ;
        ldx $65         ;Resultado lobyte leido de $65
        lda $64         ;Resultado hibyte leido de $64
        jsr intasc      ;Imprimir resultado en pantalla (X=lobyte/Acu=Hibyte)

        rts
___________________________________________________________________________________
Aqui lo mismo pero usando la pagina cero (zeropage) para pokear el puntito dentro de las coordenadas que pongais en cordx y cordy.
Primero calculo la coordenada Y*40 para saltar a la columna a la que apunte y después le sumo 1024 al resultado.
La coordenada X, simplemente usando STA indirecto indizado por Y que contiene el valor de cordx...

Código: [Seleccionar]
;Creado en CBM prg Studio

;----------------------------------------------------------------------------------------
;Este bloque separado genera una linea basic para arrancar el programa
; 10 SYS (4096)

*=$801


        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $34, $30, $39, $36, $29, $00, $00, $00
;-----------------------------------------------------------------------------------------
        *=$1000         ;inicio programa SYS4096

;Direcciones de las rutinas del basic necesarias.
facarg=$bc0c
intfac=$b391
sum=$b86a
res=$b853
mul=$ba2b
div=$bb12
facind=$bc9b

;Aqui están las coordenadas X e Y para que juguéis con ellas y poner el punto
;donde os apetezca.
cordx=#05       ;Coordenada X de pantalla. De 0 a 39
cordy=#24       ;Coordenada Y de pantalla. De 0 a 24

;Aqui el programa en cuestión.
        lda #00         ;hybyte
        ldy #cordy      ;lobyte la coordenada Y no pasa de 24
        jsr intfac      ;
        jsr facarg      ;
        lda #00         ;hibyte
        ldy #40         ;lobyte #40-$28. En la memoria de pantalla para bajar una linea se suma 40 ;)
        jsr intfac      ;
        jsr mul         ;Multiplica cordy * #40

        jsr facind      ;
        lda $64         ;Carga el hibyte resultado del calculo en el ACU
        ldy $65         ;Carga el lobyte resultado del calculo en Y
        jsr intfac      ;
        jsr facarg      ;
        lda #$04        ;La memoria de pantalla va de 0400 hasta 07E7
        ldy #$00        ;hibyte en ACU y lobyte en Y
        jsr intfac      ;
        jsr sum         ;Suma 0400 al resultado de (cordy*40)

        jsr facind      ;
        lda $64         ;Carga ACU con el hibyte resultado.
        ldx $65         ;Carga X con el lobyte resultado.
        sta $FC         ;Guarda hibyte en la zeropage.
        stx $FB         ;Guarda lobyte en la zeropage.
        ldy #cordx      ;Carga Y con el valor de cordx.
        lda #81         ;Carga ACU con el valor 81 (puntito).
        sta ($FB),y     ;Lo muestra en pantalla
        rts             ;Volver al BASIC


;Puede que no sea una forma muy rápida para hacer los calculos, pero si es más comprensible
;para usuarios noveles. Siempre estaré agradecido a JAVIER CANTERO por las ayudas que me
;brindo a la hora de programar en CM.

;Se puede usar para mover multitud de objetos en la memoria de pantalla.



Espero la ayuda de todos con correcciones , mejoras y vuestros trasteocódigos con los que aprendisteís o aprendeis.  ;)

___________________________________________________________________________________

Mostrar texto en pantalla en las coordenadas que se deseén
Aportado por R.Internacional en este hilo http://retroinvaders.com/commodoremania/foro/index.php/topic,1080.msg17747.html#msg17747

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


___________________________________________________________________________________
Rutina multiplicación rápida
Aportado por Lobogris en el hilo: http://retroinvaders.com/commodoremania/foro/index.php/topic,637.msg9662.html#msg9662
Código: [Seleccionar]
/*
  *************************************************************************************
                       RUTINA  DE  MULTIPLICACION RAPIDA * 320
 
  ENTRADAS:
  $fa     = numero multiplicador (1 byte, rango efectivo = 0 < 204)
 
  SALIDAS:
  $fb-$fc = resultado del multiplicador * 320 (precisión 16 bits)
 
  DETALLES:   
    Num. de ciclos          = 51 (+12 contando ciclos del JSR/RTS)
    Tamaño en memoria       = 29 bytes
    Max resultado teorico   = 255 * 320 = 81600 ($013EC0)
                            (no cabe en 16 bits, habria que adaptar resultado a 3 bytes)
    Max. resultado efectivo = 204 * 320 = 65280 ($FF00)
   
    Si se quiere optimizar para menor tamaño, se pueden incluir las rotaciones
    como una parte iterada dos veces por un bucle. Pero perdemos ciclos asi...

   FECHA CREACION: 05-03-13  ,   ULT. REV.: 05-03-13                           (LOBOGRIS)
  ***************************************************************************************
*/

fastMUL320:
            // Descomponiendo, resultado de n * 320 = (256 * n)  + (64 * n)
            // ahora vamos a calcular 64*numero
            // esto se consigue poniendo numero en la parte alta del resultado para obtener numero*256
            // y desplazaremos (todos los 16 bits) de resultado a la derecha 2 veces para
            // conseguir numero*64...
           
            lda numero
            clc                 // Primera rotacion lógica a la derecha (16 bits)
            lsr                 
            sta resultado+1     // Num. en parte alta resultado = multiplicar Num. * 256)
            lda resultado
            ror
            sta resultado       // Tras 1a rotación, resultado = 128 * numero
       
            clc                 // 2a rotacion a la derecha (16 bits)
            lda resultado+1
            lsr                 
            sta resultado+1
            lda resultado
            ror
            sta resultado       // aqui resultado = 64 * numero
           
            // Ahora haremos resultado = (numero * 256) + (numero * 64)
            lda numero          // Recupera numero. Al ponerlo parte alta = numero * 256
            adc resultado+1     // se añade a resultado*64 (parte alta es la única afectada)   
            sta resultado+1     // ¡Ahora resultado = 320 * numero!
            rts
« última modificación: Julio 08, 2015, 23:18:35 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #1 en: Julio 08, 2015, 00:51:43 »
Reservado para futuros listados
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Rutinas en CM mas o menos útiles
« Respuesta #2 en: Julio 08, 2015, 03:45:45 »
gracias! y muy buena la idea de ir poniendo rutinas aca.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13724
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Rutinas en CM mas o menos útiles
« Respuesta #3 en: Julio 08, 2015, 13:51:33 »
Me encantaria crear una colección con los aportes de todos para tener un lugar de consulta rápida ante esos momentos "¿y ahora como demonios hago esto?" .

Seguramente existe pero en inglés...

Quizás más adelante podemos hacer un hilo índice con chincheta, que enlace a esto que estais haciendo.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #4 en: Julio 08, 2015, 22:56:26 »
Seguramente existe pero en inglés...

Quizás más adelante podemos hacer un hilo índice con chincheta, que enlace a esto que estais haciendo.

Mi intención es recopilar todas las rutinas que se han posteado en el foro donde se enseñe a hacer algo dificil o lo mismo pero de maneras diferentes y poner las nuevas aportaciones para tener un punto de referencia desde donde empezar.

Ya me imagino que en inglés estara todo, pero si lo tenemos en castellano mejor. A mi el inglés me dificulta el aprendizaje. Puedo leerlo pero según como lo redacten se me cruzan los cables y no lo puedo traducir coerentemente y si uso el google translator... me desescojono con las traducciones .
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13724
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Rutinas en CM mas o menos útiles
« Respuesta #5 en: Julio 08, 2015, 22:58:51 »
¿Cómo piensas hacerlo? organicemos así queda bien accesible :)
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #6 en: Julio 08, 2015, 23:16:09 »
¿Cómo piensas hacerlo? organicemos así queda bien accesible :)

Pues a base de copypaste y poner el link donde está publicado.
Una vez recopiladas ,las ordenaria por orden alfabetico o crearia un índice de consulta con lo que hay recopilado.
¿Alguna sugerencia?.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #7 en: Julio 08, 2015, 23:23:40 »
gracias! y muy buena la idea de ir poniendo rutinas aca.

Gracias a vosotros por colgar vuestros trabajos para que nos peleémos con ellos.
Cuando tu programa para manejo de interrupciones esté terminado, lo colgare aqui también.
Si lo documentas con comentarios que faciliten su comprensión mucho mejor  ;)
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13724
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Rutinas en CM mas o menos útiles
« Respuesta #8 en: Julio 09, 2015, 05:22:11 »
Si quieres puedes ir haciendolo directamente en un hilo del foro y le pongo chincheta.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #9 en: Julio 09, 2015, 11:46:24 »
Si quieres puedes ir haciendolo directamente en un hilo del foro y le pongo chincheta.

Posteado a las 5:22:11... me lo parece a mi o los que tenemos un commodore no dormimos mucho?...  :-\
Somos como vampiros chupa 8 bits  ;D

Que susto me has dado, pensaba que estaba posteando en el privado.
Seguire posteando aqui las rutinas recopiladas y si teneís a bién cambiar algo o chinchetearlo , pues adelante.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13724
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Rutinas en CM mas o menos útiles
« Respuesta #10 en: Julio 09, 2015, 14:35:59 »
Posteado a las 5:22:11... me lo parece a mi o los que tenemos un commodore no dormimos mucho?...  :-\
Somos como vampiros chupa 8 bits  ;D

Es que por la noche es cuando hay TRANQUILIDAAAADDDD... eso desde siempre de toda la vida, pero con mujer y cría se nota más.

Y además tener en cuenta que estoy en otro uso horario, hemisferio, continente y universo paralelo...
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Rutinas en CM mas o menos útiles
« Respuesta #11 en: Julio 09, 2015, 17:17:44 »
Quizas tenga sentido poner estas rutinas en macros de ensamblador, y ponerlas todas en un solo archivo.
De esa manera para usuarlas, solo hay que usar ese archivo en tu juego y listo.

La pregunta del millón es que ensamblador usar, ya que cada uno tiene su propio formato de macro :)

Y se podria poner en github ese archivo.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #12 en: Julio 09, 2015, 23:19:58 »
Las rutinas que he ido colgando (excepto las de Lobogris) son muy sencillas , solo hacen lo que hacen e implementarlas en un programa usando una macro sin adaptar antes el código no lo veo útil.

Naturalmente , los programas que si se puedan usar como macro si que se podria hacer lo que comentas.

Si alguién mas experto que yo (casi todos   ;)  )  puede modificarlas para ese uso, estaré encantado.

El tema de ensamblador A, B o C si que es un lio. En mis códigos siempre pogo el assembler que he utilizado, arriba del todo. Aunque con práctica, creo que al final los reconoceremos a simple vista, como en Matrix  ;D ;D ;D

LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Rutinas en CM mas o menos útiles
« Respuesta #13 en: Julio 10, 2015, 06:43:39 »
Sere bobo. Con lo que me enseñastes ayer (Riq) , convertirlas para usar como macro es facil .
El problema es la disparidad de ensambladores , pero cada cual se lo tendra que adaptar.

No hay peor ciego que el que no sabe ver. ::)

LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13724
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Rutinas en CM mas o menos útiles
« Respuesta #14 en: Julio 10, 2015, 14:02:22 »
Y se podria poner en github ese archivo.

Eso ya es terreno semi-desconocido para mi, pocas veces he tenido que usar algo de esto (subversion) asi que no puedo hacer...
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com