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

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #60 en: Octubre 30, 2017, 15:13:48 »
Y claro ;) http://codebase64.org/doku.php me ha sido útil muchas veces.

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #61 en: Octubre 30, 2017, 15:15:56 »
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/

Mode 2

  • Commodorista
  • ***
  • Mensajes: 94
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #62 en: Octubre 30, 2017, 15:24:59 »
Estupendo, Wood. Gracias.
BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1 y 25, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #63 en: Octubre 30, 2017, 15:29:26 »
Estupendo, Wood. Gracias.
De nada chaval.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 9979
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Tutorial para comenzar a programar C en C64
« Respuesta #64 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 ;)

Mode 2

  • Commodorista
  • ***
  • Mensajes: 94
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #65 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 »
BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1 y 25, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Mode 2

  • Commodorista
  • ***
  • Mensajes: 94
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #66 en: Octubre 31, 2017, 10:20:36 »
* Digo amstradianos porque es en plan despectivo :P ;)
¡Graciosillo! ;-)
BUSCO: VideoPac+, Jaguar, Saturn, Micromanía 1 y 25, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #67 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 #68 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!

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #69 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 #70 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

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #71 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 #72 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)

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #73 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...

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Re:Tutorial para comenzar a programar C en C64
« Respuesta #74 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