@Markerror: le player n'est inspiré d'aucun autre existant hormis ceux que j'avais fait pour Oric, Exelvision et MSX qui utilisent ma compression perso, simpliste
Et merci
pour l'information sur les interruptions du VG5000, par contre j'ai désactivé le compteur d'interruption car la musique était trop lente, est ce du au fait que le Basic tourne derrière ou autre ???
Voici le code que j'ai implanté en $3E40, tu peux le re-assembler avec une adresse RAM pour tester :
On peut faire certainement mieux, mais le but était de tester le PSG sur VG5000
les données sont les valeurs des registres brut exporter du PSG format YM, converti pour l'occasion en XYM avec une compression simple avec un utilitaire "maison" mais qui fait gagné pas mal de place en RAM (16Ko pour 50/60Ko) et est décompressé à la volée.
Il reste à insérer l'extinction du son du PSG en fin de musique, une simple boucle d'envoi $00 aux 16 registres du PSG
J'imagine que ton player est bien plus évolué et surtout utilise les partitions des trackers
Code : Tout sélectionner
;-------------------------------
; VG5000
;
; TEST CARTOUCHE ROM (VG5301) AND AY-3 (VG5232)
;
; (c) 2017 6502man
;
;-------------------------------
;
AY3 .EQU $8002
TotFrame .EQU $8000
;IntCount .EQU $8004
PSG_Adr .EQU $FF
PSG_Data .EQU $FE
Int .EQU $47D0
.org $3E40
Init
DI
push AF
push BC
push DE
push HL
push IX
push IY
; on prepare les variables pour le player
LD DE,AY3+3-2 ; nombre total de frame à jouer
LD HL,TotFrame ; variable en RAM (compteur de frames)
LD A,(DE)
LD (HL),A
INC DE
INC HL
LD A,(DE)
LD (HL),A
LD DE,AY3+25-2 ; Position des données
LD HL,AY3 ; variable en RAM (pointeur des données)
LD A,D
LD (HL),A
INC HL
LD A,E
LD (HL),A
; on met en place l'interruption.
LD HL,Int
LD A,$C3
LD (HL),A
INC HL
LD DE,%START
LD A,E
LD (HL),A
INC HL
LD A,D
LD (HL),A
; LD HL,IntCount
; LD A,7
; LD (HL),A
pop IY
pop IX
pop HL
pop DE
pop BC
pop AF
EI
RET
;/////////////////////////////////////////
START
DI ; desactive INT pour musique
push AF
push BC
push DE
push HL
push IX
push IY
; LD HL,IntCount ; test si 6eme occurence d'appel
; DEC (HL) ; de l'interruption
; JP NZ,FinInt
;
; LD HL,IntCount ; remet le compteur à 7
; LD A,7
; LD (HL),A
LD HL,AY3 ; variable en RAM (pointeur des données)
LD A,(HL)
LD D,A
INC HL
LD A,(HL)
LD E,A
BoucleAY3
LD C,00
LD A,(DE) ; on lit le premier octet de compression XYM
LD H,A ; on reserve l'octet
INC DE
LD A,(DE) ; on lit le deuxieme octet de compression XYM
LD L,A ; on reserve l'octet
INC DE
LD B,$09 ; compteur de décalage bits des 2 octets lu précedement
Frame
DEC B
JP Z,Oct2
LD A,C
OUT (PSG_Adr),A
INC C
SLA H ; décale 1 bit à gauche et récupére l'état du bit dans Carry
JP NC,Frame
LD A,(DE)
OUT (PSG_Data),A
INC DE
JP Frame
Oct2
LD B,$07 ; compteur de décalage des bits 2 octets lu précedement
Frame2
DEC B
JP Z,EndFrame
LD A,C
OUT (PSG_Adr),A
INC C
SLA L ; décale 1 bit à gauche et récupére l'état du bit dans Carry
JP NC,Frame2
LD A,(DE)
OUT (PSG_Data),A
INC DE
JP Frame2
EndFrame
; test fin de la musique ?
LD HL,TotFrame+1 ; variable en RAM
DEC (HL)
JP NZ,Continueplay
LD HL,TotFrame ; variable en RAM
DEC (HL)
LD A,$00
CP (HL)
JP Z,Exit
Continueplay
; mise à jour du pointeur
LD HL,AY3 ; variable en RAM (pointeur des données)
LD A,D
LD (HL),A
INC HL
LD A,E
LD (HL),A
FinInt
pop IY
pop IX
pop HL
pop DE
pop BC
pop AF
EI ; retabli INT
RET
Exit
LD HL,Int
LD A,$C9 ; arrete l'interruption.
LD (HL),A
;Eteindre le son du AY-3
JP FinInt
ENDFILE
.END
Et voici les données à charger en $8000, j'ai voulu en même temps tester la RAM et le PSG en condition réel
Est ce que ça vaut le coût que je modifie ce player pour l'intégrer en fin de ROM Basic pour ceux qui voudrait sonoriser leurs programmes ?
Il faut juste prévoir un CLEAR,xxxx pour protéger la zone des données de la musique, et prendre en paramètre l'adresse des données musique, et peut être un flag pour boucler la musique !
@Carl:
- Que fait LGRAPH ?
- comment est il appelé dans les programmes BASIC ?
1) le problème est qu'il est situé en RAM si on veux le mettre en ROM il faut modifier le programme en conséquence (translater toutes les adresses) !
2) la taille 1181 octets dépasse la taille dispo en fin de ROM BASIC !