; Driver Z80 Neogeo MVS ADPCM-A + SSG pour Astrosmash ; Basé sur le driver d'example d'MVSTracker ; CC - Furrtek 2010 .memorymap DEFAULTSLOT 0 SLOTSIZE $1000 SLOT 0 $0000 SLOTSIZE $1000 SLOT 1 $1000 .ENDME .ROMBANKMAP BANKSTOTAL 1 BANKSIZE $1000 BANKS 1 .ENDRO .define STACK $FFFF .define RAM_ADDR $F800 .ENUM RAM_ADDR NextPCMChn DB LastCmd DB .ENDE .bank 0 slot 0 .org $0000 di jp EntryPoint sendDEPortA: push af ld a, d out (4), a ld a, e out (5), a pop af ret sendDEPortB: push af ld a, d out (6), a ld a, e out (7), a pop af ret ;VBL (pas utilisé): .org $38 di push af xor a out (0ch), a pop af reti ;NMI: .org $66 push af push bc push de push hl in a,($00) ld (LastCmd),a or a jr z, NMI_End cp 1 jr z, Commtest cp 3 jr z, Reset call ProcessCommands ld a,(LastCmd) out ($00),a ;Pas sûr de ce que c'est, mais nécessaire (réactiver interruptions ?) or $80 out ($0C),a ;ACK avec le bit 7 à 1 NMI_End: pop hl pop de pop bc pop af retn .db " FURRTEK'S NG SOUND DRIVER V0.12 " Commtest: di ld sp,STACK ;Répond 1 à la commande 1 out ($0C),a jr NMI_End Reset: di ld sp,STACK ;Reset sur commande 3 ld hl,0 push hl retn ;RETN à 0 ProcessCommands: or a ret z cp $7F ;Commande $7F: silence SSG jp z, SSG_Silence bit 7,a ;Commande > $7F: Sample ADPCM-A jp nz, Process_Sample ld d, 0h ;Commande < $7F: Bip SSG, fréquence dérivée du numéro de la commande sla a ld e, a ;ld de, 0080h call sendDEPortA ;Fine tune canal SSG A (commande*2) ld de, $0100 call sendDEPortA ;Coarse tune canal SSG A (0) ld de, $0B0F call sendDEPortA ;Fine tune enveloppe ld de, $0C05 call sendDEPortA ;Coarse tune enveloppe (Total: $50F) ld de, $0708 call sendDEPortA ;SSG registre 7 = $08 (pas de bruit blanc) ld de, $0810 call sendDEPortA ;SSG registre 8 = $10 (lié à l'EG) ld de, $0D08 call sendDEPortA ;SSG registre $D = $08 (type d'enveloppe: rampe décroissante) ret SSG_Silence: ld de, 070Fh call sendDEPortA ;SSG registre 7 = $0F (disable all channels) ld de, 0800h call sendDEPortA ;SSG registre 8, Canal A volume=0 ld de, 0900h call sendDEPortA ;SSG registre 9, Canal B volume=0 ld de, 0A00h call sendDEPortA ;SSG registre $A, Canal C volume=0 ret Process_Sample: and $7F ;Vire le bit 7 de la commande ld l, a ld h, 0 add hl, hl add hl, hl ld de, SampleStarts add hl, de ;HL=SampleStarts+(commande*4) push hl pop ix ;IX=HL ld a, (NextPCMChn) ;Rotation des canaux ld b, a inc a cp 6 jr nz,NoWrap xor a NoWrap: ld (NextPCMChn), a ld a,b ;A=numéro du canal add a,$10 ;Start LSB ld d,a ld e,(ix + 0) call sendDEPortB add a,8 ;Start MSB ld d,a ld e,(ix + 1) call sendDEPortB add a,8 ;Fin LSB ld d,a ld e,(ix + 2) call sendDEPortB add a,8 ;Fin MSB ld d,a ld e,(ix + 3) call sendDEPortB ld a,b ;A=numéro du canal ld l,a ld h,0 ld de,KeyOn add hl,de ;HL=KeyOn+Canal ld e,(hl) ld d,0 call sendDEPortB ;"Dump" reste à 0 ret KeyOn: .db $01,$02,$04,$08,$10,$20 EntryPoint: ld sp,STACK im 1 ld de,RAM_ADDR+1 ;Clear 256 octets en RAM (osef) ld hl,RAM_ADDR ld (hl),0 ld bc,$00FF ldir ld de, $2730 ;FM reset, pas de timers call sendDEPortA ld de, $013f ;Volume ADPCM-A à fond call sendDEPortB ei lp: jr lp SampleStarts: .db $00,$00 ; Explosion .db $35,$00 ; Fin .db $36,$00 ; Tir .db $43,$00 ; Fin