Autor Tema: Tutorial para comenzar a programar C en C64  (Leído 57643 veces)

Mode 2

  • Commodorista
  • ***
  • Mensajes: 97
    • Ver Perfil
    • brick Fabrik
Re:Tutorial para comenzar a programar C en C64
« Respuesta #60 en: Octubre 30, 2017, 15:24:59 »
Estupendo, Wood. Gracias.
https://brickfabrik.webador.es/

BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #61 en: Octubre 30, 2017, 15:29:26 »
Estupendo, Wood. Gracias.
De nada chaval.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 14837
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Tutorial para comenzar a programar C en C64
« Respuesta #62 en: Octubre 30, 2017, 17:31:57 »
Agregado!, tengo que buscar en el foro que hay varios más: http://retroinvaders.com/commodoremania/foro/index.php?topic=911

* Digo amstradianos porque es en plan despectivo :P ;)
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Mode 2

  • Commodorista
  • ***
  • Mensajes: 97
    • Ver Perfil
    • brick Fabrik
Re:Tutorial para comenzar a programar C en C64
« Respuesta #63 en: Octubre 31, 2017, 10:17:43 »
Otro en inglés, mirar en "Rants" y algunos de los juegos tienen el código fuente - uno de ellos con comentários detallados como funciona todo. https://cadaver.github.io/
Acabo de echarle un ojo a este enlace, es una pasada.
Hay una versión en videojuego de "Escape fron New York" de John Carpenter (precisamente el de los comentarios detallados). Mi dire favorito, ¡¡woooow!!! :-O
« última modificación: Octubre 31, 2017, 10:20:00 por Mode 2 »
https://brickfabrik.webador.es/

BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Mode 2

  • Commodorista
  • ***
  • Mensajes: 97
    • Ver Perfil
    • brick Fabrik
Re:Tutorial para comenzar a programar C en C64
« Respuesta #64 en: Octubre 31, 2017, 10:20:36 »
* Digo amstradianos porque es en plan despectivo :P ;)
¡Graciosillo! ;-)
https://brickfabrik.webador.es/

BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #65 en: Octubre 31, 2017, 11:15:36 »
Acabo de echarle un ojo a este enlace, es una pasada.
Hay una versión en videojuego de "Escape fron New York" de John Carpenter (precisamente el de los comentarios detallados). Mi dire favorito, ¡¡woooow!!! :-O
Con ese se puede aprender muchisimo. :)

HyLian

  • Commodorero
  • **
  • Mensajes: 25
  • SYS 0
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #66 en: Diciembre 26, 2017, 13:06:29 »
Buenas!

Estoy liado con el cc65 para hacer un jueguecillo, mayormente en C.

Estoy intentando colocar los datos de mis sprites, directamente en memoria, (el juego es sencillo y no necesitare cambiar mucho los sprites), y asi ahorrarme una copia en el propio programa.

Para ello estoy usando un fichero .cfg de configuracion del linker. Tengo (de momento) dos ficheros, el main.c y el sprites.s. El sprites.s tiene una pinta asi:

.segment "SPRITES"
.byte $ff, $ff....
.byte ...
...

y en el config.cfg tengo algo asi:

MEMORY {
...
    SPRITES:  file = %O, define = yes, start = $2000,           size = $1000;
}

SEGMENTS {
...
    SPRITES:      load = SPRITES,      type = ro,  define = yes;
...
}

Pues bien, compilo con el cl65, no da ningun error, ejecuto el prg, y por lo que puedo ver en el monitor del VICE, en $2000 no hay ni rastro de los sprites definidos en sprites.s :(

Sabeis que puedo estar haciendo mal?

Gracias de antebrazo!

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #67 en: Diciembre 26, 2017, 13:28:40 »
Hola HyLian

No sé si será esto pero aquí va:

En mi fichero cfg tengo, RAM4: start = $d000, size = $1000, type = rw, fill = yes, file = %O;
Será que te falta: fill = yes ?

HyLian

  • Commodorero
  • **
  • Mensajes: 25
  • SYS 0
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #68 en: Diciembre 26, 2017, 14:14:27 »
Hola HyLian

No sé si será esto pero aquí va:

En mi fichero cfg tengo, RAM4: start = $d000, size = $1000, type = rw, fill = yes, file = %O;
Será que te falta: fill = yes ?

Hola!, Gracias por contestar!. he probado con fill = yes y lo mismo... al arrancar el PRG, con el monitor del vice hago "m $2000", y alli no hay ni rastro de mis sprites.

Hay una cosa que me extraña, en el fichero que sale cuando sacas el memory map del fichero (con la opcion -vm y -m),

sale esto:
mysprites.o:
    CODE              Offs=00035F  Size=000000  Align=00001  Fill=0000
    RODATA            Offs=000000  Size=000000  Align=00001  Fill=0000
    BSS               Offs=000000  Size=000000  Align=00001  Fill=0000
    DATA              Offs=000000  Size=000000  Align=00001  Fill=0000
    ZEROPAGE          Offs=000000  Size=000000  Align=00001  Fill=0000
    NULL              Offs=000000  Size=000000  Align=00001  Fill=0000
    SPRITES           Offs=000000  Size=000040  Align=00001  Fill=0000

Parece que lo esta metiendo en el segmento de CODE, en lugar del de SPRITES, pese a que mysprites.s tiene un .segment "SPRITES" bien grande en la primera linea

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #69 en: Diciembre 26, 2017, 14:28:33 »
lo que uso en ABABOL es:

MEMORY {
    ZP:  start = $0002, size = $00fe, type = rw, define = yes;
    RAM: start = $07ff, size = $0101, fill = yes, file = %O, define = yes;
    RAMa: start = $0900, size = $1A01, fill = yes, file = %O;
    RAMb: start = $2301, size = $9cff, fill = yes, file = %O;
    RAM1: start = $c000, size = $0400,type = rw,  fill =yes, file = %O;    
    RAM2: start = $c400, size = $0400, type = rw, fill = yes, file = %O;
    RAM3: start = $c800, size = $0800, type = rw, fill = yes, file = %O;
    RAM4: start = $d000, size = $1000, type = rw, fill = yes, file = %O;
    RAM5: start = $e000, size = $1ff9, type = rw, file = %O;
   
   
}

SEGMENTS {
   
    STARTUP:  load = RAM, type = ro;
    INIT:     load = RAM, type = ro, define = yes, optional = yes;
   
    SID:   load = RAMa , start = $0900, type = ro;
   
    CODE:     load = RAMb, type = ro, define = yes;
   ZEROPAGE: load = ZP,  type = zp;
    ZPSAVE:   load = RAMb,  type = bss, define =yes, optional = yes;
    BSS:      load = RAMb, type = bss, define = yes;
    RODATA:   load = RAMb, type = ro;
    DATA:     load = RAMb, type = rw;
    COMPACTDATA:    load = RAMb, start = $7a00, type = ro, optional = yes;
    EXODEPACK: load = RAMb, start= $9e00, type = rw, optional = yes;
    SPRITES2:  load = RAMb, start= $a200, type = ro, optional = yes;
   
 
    SPRITES:  load = RAM4, start = $d000, type = ro, optional = yes;
    ABABOLCHARS: load = RAM5, type = ro;
    TILECOLOURS: load = RAM5, start = $e800, type = ro;
    ABABOLANIM: load = RAM5, start =$e900, type = ro;
    BITMAPSCREEN: load = RAM5, type = rw;
    RESTO: load = RAM5, start = $ff40 type = rw;
   
}
« última modificación: Diciembre 26, 2017, 14:30:23 por Wood »

HyLian

  • Commodorero
  • **
  • Mensajes: 25
  • SYS 0
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #70 en: Diciembre 28, 2017, 13:36:04 »
Hola de nuevo!

No soy capaz de que me ponga en la dichosa posicion los bytes.

He visto el PRG que genera, y mis sprites estan por el offset $0530, que parece que es justo despues de mi codigo y todo el codigo de c64.lib que mete el compilador. De hecho en el monitor del vice miro en la posicion de memoria $0D31 que es $801 + $530, y estan alli!

Este es mi cfg (una copia del c64.cfg por defecto mas lo de los SPRITES). Si quito cosas de ahi me da fallo al linkar... entiendo que son cosas usadas por el c64.lib que se linka automaticamente al usar los headers de c64.h.

Código: [Seleccionar]
FEATURES {
    STARTADDRESS: default = $0801;
}
SYMBOLS {
    __LOADADDR__:  type = import;
    __EXEHDR__:    type = import;
    __STACKSIZE__: type = weak, value = $0800; # 2k stack
    __HIMEM__:     type = weak, value = $D000;
}
MEMORY {
    ZP:       file = "", define = yes, start = $0002,           size = $001A;
    LOADADDR: file = %O,               start = %S - 2,          size = $0002;
    HEADER:   file = %O, define = yes, start = %S,              size = $000D;
    MAIN:     file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __HEADER_LAST__;
    SPRITES:  file = %O,               start = $2000,           size = $1000, fill = yes, type = ro;
    BSS:      file = "",               start = __ONCE_RUN__,    size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
}
SEGMENTS {
    ZEROPAGE: load = ZP,       type = zp;
    LOADADDR: load = LOADADDR, type = ro;
    EXEHDR:   load = HEADER,   type = ro;
    STARTUP:  load = MAIN,     type = ro;
    LOWCODE:  load = MAIN,     type = ro,  optional = yes;
    CODE:     load = MAIN,     type = ro;
    RODATA:   load = MAIN,     type = ro;
    DATA:     load = MAIN,     type = rw;
    INIT:     load = MAIN,     type = rw;
    ONCE:     load = MAIN,     type = ro,  define   = yes;
    BSS:      load = BSS,      type = bss, define   = yes;
    SPRITES:  load = SPRITES,  type = ro;
}
FEATURES {
    CONDES: type    = constructor,
            label   = __CONSTRUCTOR_TABLE__,
            count   = __CONSTRUCTOR_COUNT__,
            segment = ONCE;
    CONDES: type    = destructor,
            label   = __DESTRUCTOR_TABLE__,
            count   = __DESTRUCTOR_COUNT__,
            segment = RODATA;
    CONDES: type    = interruptor,
            label   = __INTERRUPTOR_TABLE__,
            count   = __INTERRUPTOR_COUNT__,
            segment = RODATA,
            import  = __CALLIRQ__;
}

Estoy por tirar la toalla con el linker y hacerme un programilla que ponga en la posicion adecuada en el PRG los datos de los sprites... (Asumiendo que el PRG es un formato "plano" donde se copia byte a byte la info a partir de lo que digan los dos primeros bytes)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #71 en: Diciembre 28, 2017, 13:39:39 »
Eso es porque no está llenando la memória vacía con ceros antes de meter los demás datos. Ahora saber porqué ya que el "fill" no ha funcionado...

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 233
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #72 en: Diciembre 28, 2017, 13:42:28 »
No sé si te puede ayudar, esto es parte de mi makefile de UWOL:

compila:    
   
         cl65 --cpu 6502X -O  $(TESTE).c  uwolasm.s sprites.s music.s fases.s compactdata.s $(LIB).lib -o $(TESTE).o --config $(TESTE).cfg -m mapa.mem -vm -Ln $(TESTE).lbl  -v
   
crunch:       test
         ./pucrunch.exe -x0x080d $(TESTE).o  $(TESTE).prg

HyLian

  • Commodorero
  • **
  • Mensajes: 25
  • SYS 0
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #73 en: Diciembre 28, 2017, 14:24:42 »
Eso es porque no está llenando la memória vacía con ceros antes de meter los demás datos. Ahora saber porqué ya que el "fill" no ha funcionado...

Creo que esto es la clave, he probado a poner un fill=yes en la parte de memoria que esta justo antes, y efectivamente lo llena con 0s

Pero entonces, no acabo de entender para que sirve el "start", ya que tienes que calcular que la seccion anterior ocupe justo para que acabe antes del start y encima meterle un fill=yes para que lo llene con 0s.

Yo esperaria que si le digo que empiece en el $2000, que haga lo que necesite para que eso este alli :-/.

Hay algo que se me escapa, creo :)

Lo he cuadrado, a mano pero aun asi, me sigue sin funcionar  >:(

Ahora en el PRG veo que el spirte esta $1801,  ($1801 - 2) + $801 = $2000. Lo que parece correcto. Pero al cargar el prg en el vice, en $2000, no esta el sprite! :(

Estoy empezando a pensar que tengo algo en el programa que hace que se sobreescriba ese $2000, por que en el resto de direcciones si que veo que este lo que va en el PRG

HyLian

  • Commodorero
  • **
  • Mensajes: 25
  • SYS 0
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #74 en: Diciembre 28, 2017, 15:09:24 »
Vale... culpa mia :facepalm:. Estaba copiando la ROM de caracteres en $2000, ya que tengo puesto que alli esta la ram de caracteres....

He movido el sprite a $1500 y ahora en el vice ya veo los datos del sprite en memoria. Aunque ahora lo que sale por pantalla es basura en lugar de lo que deberia aparecer jejeje, aunque esto es ya otro problema :)

Mi puntero de sprites esta en 0x07F8 y vale 0x54 que deberia apuntar a $1500... asi que algo estoy haciendo mal por otro lado :)

Gracias @Wood por las pistas, el fill de la zona anterior era la clave :)