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 (http://www.msx.org/forum/msx-talk/development/arkostracker-msx-playroutine-sdcc-z80-syntax)
Thanks.
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 (http://www.msx.org/forum/msx-talk/development/arkostracker-msx-playroutine-sdcc-z80-syntax)
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.
Thanks for this code. I'm going to try.
Envoyé de mon GT-N7000 en utilisant Tapatalk
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;
}