News:

Printed Amstrad Addict magazine announced, check it out here!

Main Menu

Using Arkos player into my SDCC code.

Started by Baptiste, 06:35, 24 June 14

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Baptiste


Hello,


I discover a little bit late this community, and I am delighted to be finally able to have time to recover in the CPC. My first message will have nothing original I presume, but I would want to be able to use the player Arkos in my program SDCC (for CPC). I use Arkos Traker 1.0 (very well tracker) and SDCC 3.4.


Is there an example of code SDCC?


I found this link, but I do not know if it is adapted for the CPC.
ArkosTracker MSX playroutine, SDCC as-z80 syntax | MSX Resource Center


Thanks.

arnoldemu

#1
Quote from: Baptiste on 06:35, 24 June 14
Hello,


I discover a little bit late this community, and I am delighted to be finally able to have time to recover in the CPC. My first message will have nothing original I presume, but I would want to be able to use the player Arkos in my program SDCC (for CPC). I use Arkos Traker 1.0 (very well tracker) and SDCC 3.4.


Is there an example of code SDCC?


I found this link, but I do not know if it is adapted for the CPC.
ArkosTracker MSX playroutine, SDCC as-z80 syntax | MSX Resource Center


Thanks.
I have attached a library I made.

Use it like this:


#include "ArkosPlayer.h"


to play use interrupt:

void interrupt_handler(void) __critical __interrupt(1)
{
    if (cpc_InVsync())
    {
    ArkosPlayer_Play();
}
}


to stop:


    /* stop the sound */
    ArkosPlayer_Stop();


to set music/sfc (current_sound points to binary music data in memory)

/* stop the sound */
    ArkosPlayer_Stop();
 
  ArkosPlayer_Init(current_sound);


build the library like this (or use make.sh for linux):

cd lib\arkostrackerlib
call make.bat
cd ..\..


link it like this:

-j
-m
-u
-i game.ihx
-w
-x
-l lib/arkostrackerlib/arkostrackerlib.lib
-e


I converted the sound into header files, but you need to make sure they are located at exactly the correct place for arkos tracker to use it because there is no extra relocation code (my starkos code for sdcc used relocation code by Tom et Jerry).

a bit like this:


const unsigned char game_start_aks_bin[259] =
{
    0x041,0x054,0x031,0x030,0x001,0x040,0x042,0x00f,0x002,0x004,0x045,0x000,0x040,0x0a6,0x049,0x0a6,
    0x067,0x0a6,0x000,0x000,0x000,0x000,0x000,0x000,0x00d,0x042,0x0a6,0x002,0x000,0x034,0x038,0x0b4,
    0x0fe,0x0ff,0x030,0x02c,0x0a8,0x0fe,0x0ff,0x024,0x020,0x09c,0x0fe,0x0ff,0x018,0x014,0x090,0x0fe,
    0x0ff,0x00c,0x008,0x084,0x0fe,0x0ff,0x00d,0x042,0x0a6,0x001,0x000,0x07e,0x024,0x00c,0x07a,0x022,
    0x009,0x076,0x021,0x006,0x074,0x003,0x030,0x030,0x0b0,0x0fc,0x0ff,0x0b0,0x0fc,0x0ff,0x00d,0x074,
    0x0a6,0x030,0x000,0x000,0x000,0x097,0x0a6,0x000,0x09b,0x0a6,0x0c9,0x0a6,0x0f1,0x0a6,0x010,0x022,
    0x0a7,0x027,0x0a7,0x02c,0x0a7,0x004,0x001,0x08c,0x0a6,0x011,0x04a,0x00d,0x000,0x0ac,0x0e1,0x000,
    0x000,0x001,0x006,0x05f,0x006,0x067,0x006,0x06d,0x006,0x073,0x006,0x073,0x002,0x073,0x002,0x071,
    0x002,0x06d,0x002,0x069,0x006,0x06d,0x00a,0x042,0x000,0x042,0x003,0x042,0x005,0x042,0x007,0x042,
    0x009,0x042,0x00b,0x042,0x00d,0x042,0x00f,0x042,0x011,0x042,0x013,0x06e,0x0e1,0x000,0x000,0x002,
    0x00e,0x02f,0x006,0x02f,0x042,0x000,0x042,0x000,0x002,0x02b,0x00e,0x029,0x00e,0x02f,0x00a,0x042,
    0x000,0x042,0x003,0x042,0x005,0x042,0x007,0x042,0x009,0x042,0x00b,0x042,0x00d,0x042,0x00f,0x042,
    0x011,0x042,0x013,0x042,0x080,0x000,0x000,0x002,0x0ac,0x067,0x001,0x006,0x05f,0x006,0x067,0x006,
    0x06d,0x006,0x073,0x006,0x073,0x002,0x073,0x002,0x071,0x002,0x06d,0x002,0x069,0x006,0x06d,0x006,
    0x042,0x000,0x042,0x009,0x042,0x00b,0x042,0x00d,0x042,0x00f,0x042,0x011,0x042,0x013,0x042,0x015,
    0x042,0x017,0x042,0x019,0x042,0x080,0x000,0x000,0x000,0x042,0x080,0x000,0x000,0x000,0x042,0x080,
    0x000,0x000,0x000

}; /* game_start_aks_bin */


My build works like this:

1. convert to music to binary using akstobin
2. convert to array
3. link all the data together and generate binary
4. read the symbols, find the location of the data
5. regenerate data knowing this new address
6. inject correct data into binary.
My games. My Games
My website with coding examples: Unofficial Amstrad WWW Resource

Baptiste

Thanks for this code. I'm going to try.

Envoyé de mon GT-N7000 en utilisant Tapatalk


Baptiste

Hello,


I found.


main.h

#include "inc/core/accessfile.h" // Loading file and saving file functions
#include "inc/core/music.h"; // Mucis controls functions


// Filenames

const char Player[11] = {'P','L','A','Y','E','R','.','B','I','N',0};
const char Music[10] = {'M','U','S','I','C','.','B','I','N',0};



void main(){
    LoadFile(Player, 0x4700); // Player file (at #0x4700 address)
    LoadFile(Music, 0x4000); // Music file (at #0x4000 address)


    playMusic(); // Play music under interrupt
    while(1){}
}



accessfile.h

////////////////////////////////////////////////////////////////////////
//Load filename to address
////////////////////////////////////////////////////////////////////////
// IL FAUT UTILISER "--oldralloc" POUR COMPILER !
// code retout :
// 0 Ok
// -1 Erreur
int LoadFile(char* filename, char* readbuffer)
{


   __asm


   ; Initialisation de l amsdos (ROM 7) avant le changement d un fichier
   ld      hl,(#0xBE7D)   ; adresse de la zone réservée AMSDOS
   ld      a,(hl)         ; drive
   push    hl
   push    af
   ld      de,#0x40      ;DE-HL contient la plage dans laquelle la rom doit être recherchée
   ld      hl,#0xABFF
   ld      c,#7         ;contient l'adresse de sélection de rom à tester
   call    #0xBCCE         ;initialisation d'une rom de second plan
   pop      af
   pop      hl
   ld      (hl),a         ; on remet le drive courant
   
   ; récupere le parametre char* filename
   LD L, 4(IX)
   LD H, 5(IX)
   ;LD B, 8(IX)
   
   ; calcule la longeur du nom de fichier
   call load_getfilenamesize
   
   ; B = longueur du nom de fichier en caractères
   ; HL = l adresse de début du nom de fichier
   
   ;; DE = l adresse d'un tampon 2k
   ;; En mode disque: cette mémoire tampon n'est pas utilisé lorsque Fonction firmware
   ;; CAS EN DIRECT est utilisé, il est donc prudent de le mettre nulle (0)
   ;; Vous le souhaitez.
   ld de,#0


   ;; fonction du firmware pour ouvrir un fichier en lecture
   call #0xbc77


   ;; cas_in_open retour:
   ;; si le fichier a été ouvert avec succès:
   ;; - carry est vrais
   ;; - HL contient l adresse de l en-tête du fichier s AMSDOS
   ;; - DE contient l adresse de chargement du fichier (à partir de l en-tête)
   ;; - BC contient la longueur du fichier (à partir de l en-tete du fichier)
   ;; - A contient le type de fichier (2 pour les fichiers binaires)
   ; si une erreur on sort le la fonction
   JR NC,LOAD_ERRDRIV
   JR Z,LOAD_ERRDRIV
   
   ;; fonction du firmware pour charger le fichier en entier
   ;; cela fonctionne avec les fichiers qui ont un en-tête AMSDOS (les
   ;; fichiers ASCII n'ont pas un en-tête)
   
   ; récupere le parametres char* readbuffer
   LD L, 6(IX)
   LD H, 7(IX)


   ;; Lecture du fichier
   call #0xbc83


   ;; fonction du firmware pour fermer un fichier ouvert en lecture
   call #0xbc7a
   
   jp load_asmFin


   LOAD_ERRDRIV:
      ;LD (FLGERR),A  ;Sort ici si erreur drive
      CALL #0xBC7D
      ; il y a une erreur, on retourne cette erreur....
      ; enfin pour le moment juste la valeur -1
      ld   hl,#0xFFFF
      pop   ix
      ret
     
      ; Calcule la longeur du nom de fichier.


   load_getfilenamesize:
      push de
      push hl
      ld e,#0


   load_getfilenamesizeloop:
      ld a, (hl)
      or a
      jp z, load_getfilenamesizeend
      inc hl
      inc e
      jp load_getfilenamesizeloop


   load_getfilenamesizeend:
      pop hl
      ld b, e
      pop de
      ret   
     
   load_asmFin:
     
   __endasm;
   return 0;
}


// IL FAUT UTILISER "--oldralloc" POUR COMPILER !
// code retout :
// 0 Ok
// -1 Erreur
int SaveFileBin(char* filename, char* readbuffer, int lenght)
{
   __asm


   ; Initialisation de l amsdos (ROM 7) avant le changement d un fichier
   ld hl,(#0xBE7D) ; adresse de la zone réservée AMSDOS
   ld a,(hl) ; drive
   push hl
   push af
   ld de,#0x40 ;DE-HL contient la plage dans laquelle la ROM doit être recherchée
   ld hl,#0xABFF
   ld c,#7 ;contient l'adresse de sélection de ROM à tester
   call #0xBCCE ;initialisation d'une ROM de second plan
   pop af
   pop hl
   ld (hl),a ; on remet le drive courant


   ; récupere le parametre char* filename
   LD L, 4(IX)
   LD H, 5(IX)
   ;LD B, 8(IX)


   ; calcule la longeur du nom de fichier
   call save_getfilenamesize


   ; B = longueur du nom de fichier en caractères
   ; HL = l adresse de début du nom de fichier


   ;; DE = l adresse d'un tampon 2k
   ;; En mode disque: cette mémoire tampon n'est pas utilisé lorsque Fonction firmware
   ;; CAS EN DIRECT est utilisé, il est donc prudent de le mettre nulle (0)
   ;; Vous le souhaitez.
   ld de,#0


   ;; fonction du firmware pour ouvrir un fichier en ecriture
   call #0xBC8C


   ;; cas_in_open retour:
   ;; si le fichier a été ouvert avec succès:
   ;; - carry est vrais
   ;; - HL contient l adresse de l en-tête du fichier s AMSDOS
   ;; - DE contient l adresse de chargement du fichier (à partir de l en-tête)
   ;; - BC contient la longueur du fichier (à partir de l en-tete du fichier)
   ;; - A contient le type de fichier (2 pour les fichiers binaires)
   ; si une erreur on sort le la fonction
   JR NC,SAVE_ERRDRIV
   JR Z,SAVE_ERRDRIV


   ;; fonction du firmware pour sauver la mémoire dans le fichier en entier
   ;; cela fonctionne avec les fichiers qui ont un en-tête AMSDOS (les
   ;; fichiers ASCII n'ont pas un en-tête)


   ; récupere le parametres char* readbuffer
   LD L, 6(IX)
   LD H, 7(IX)


   ; récupere le parametres int lenght
   LD E, 8(IX)
   LD D, 9(IX)


   LD A, #2 ; Type de fichier (binaire)


   ; BC l adresse du point d entree;
   LD BC,#0


   ;; Ecriture du fichier
   call #0xBC98


   ;; fonction du firmware pour fermer un fichier ouvert en ecriture
   call #0xBC8F


   jp save_asmFin


   SAVE_ERRDRIV:
      ;LD (FLGERR),A ;Sort ici si erreur drive
      CALL #0xBC92
      ; il y a une erreur, on retourne cette erreur....
      ; enfin pour le moment juste la valeur -1
      ld hl,#0xFFFF
      pop ix
      ret




   save_getfilenamesize:
      push de
      push hl
      ld e,#0


   save_getfilenamesizeloop:
      ld a, (hl)
      or a
      jp z, save_getfilenamesizeend
      inc hl
      inc e
      jp save_getfilenamesizeloop


   save_getfilenamesizeend:
      pop hl
      ld b, e
      pop de
      ret


   save_asmFin:
   __endasm;
   return 0;
}



music.h

void playMusic(){
   // Play music
   __asm
      ld de, #0x4000
      call #0x4700
   __endasm;
   music_playing = 1;
}


void stopMusic(){
   // Stop music
   __asm
      ld de, #0
      call #0x4700
   __endasm;
   music_playing = 0;
}

Powered by SMFPacks Menu Editor Mod