MSX Village forum

L'atelier Fabrication d'une flashrom 1024ko à mapper SCC

Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10287

Le 28/05/2013 à 20h38

Reprise du message précédent

le probléme n'est pas l'upgrade a 1024k mais comment programmer un fichier dans 2 flashs différentes avec le même programme


:noel
Site web    
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 28/05/2013 à 23h14
J'ai une flashrom 1024ko mais c'est en SOP, dur dur à souder :oups

Je l'ai déjà utiliser une en mapper Konami pour ma carte PC Engine.
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 29/05/2013 à 00h11
Jipe :
le probléme n'est pas l'upgrade a 1024k mais comment programmer un fichier dans 2 flashs différentes avec le même programme






igal :
Et voila! Ca vient tout juste de tomber:

****************************************

Hi Igal,



Yes you can publish the source code on MsxVillage if you want.



I didn't spend time cleaning it up, but it is fairly readable as is.



If people have questions, feel free to ask. I'll keep an eye on

the forum to see if anything comes up and if people post any

improvements (bigger roms for example).



Thanks,

-Daniel

****************************************



Un grand merci à Daniel. Vraiment sympa de sa part. :top :top :top



Son site => http://www.dvik-joyrex.com/



C'est donc une exclusivité du MSXVILLAGE que voici:



Les Sources => leilak.zip



Code TEXT :
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
 
 
        fname "leila_k.rom"
 
        org 4000h
        dw  4241h,START,0,0,0,0,0,0
 
 
Bank1:  equ      05000h
Bank2:  equ      07000h
Bank3:  equ      09000h
Bank4:  equ      0B000h
 
 
;SampleFrequency: equ 22050
SampleFrequency: equ 14466
;SampleFrequency: equ 11025
 
Period: equ      3579545 / SampleFrequency
 
;-------------------------------------
; Entry point
;-------------------------------------
START:
        call powerup
        xor a
        call 005Fh
 
        di
 
        call    VdpTest
        jp      z,.sc2
        call    LoadIntro7
        call    IntroDelay
        call    LoadScreen7
        jp      .cont
.sc2:
        call    LoadIntro2
        call    IntroDelay
        call    LoadScreen2
.cont:
 
        ld  a,3Fh
        LD  (Bank3),A
 
        call    SccInit
 
        call    ReplayerInit
 
        call    PlaySynced          ; Workaround for SCC defect
        ret
 
 
 
IntroDelay:       
        ei
        ld      b,100
.loop:
        halt
        djnz    .loop
        di
        ret
 
;-------------------------------------
;; Need to wait enough to not access SCC while
;; playing sample 15 and 16. This method takes
;; this into account
;-------------------------------------
PlaySynced:
.aloop:
IF 1
        ld      b,170
.busywait:
        nop
        nop
        nop
        nop
        djnz    .busywait
ELSE
        ld      b,140
.busywait2:
        nop
        nop
        nop
        nop
        djnz    .busywait2
 
        ld      b,38
        ld      hl,9800h+32*3
.busywait3:
        cp      (hl)
        cp      (hl)
        djnz    .busywait3
ENDIF
 
        call    ReplayerUpdate32
        jp      .aloop
        ret
 
 
;-------------------------------------
; Initialize the scc
;-------------------------------------
SccInit:
        ld  a,15
        ld  (988Ah),a       ; volume ch1
 
        xor a
        ld  (988Bh),a       ; volume ch2
        ld  (988Ch),a       ; volume ch3
        ld  (988Dh),a       ; volume ch4
        ld  (988Eh),a       ; volume ch5
 
        ld  a,00011111b     ;   ALL channels active
        ld  (988Fh),a
 
        ld      hl,9800h+32*3   ; counter in channel 4
        ld      bc,2000h
.counter:
        ld  (hl),c
        inc hl
        inc c
        djnz  .counter
 
        ld  a,10100000b ; Rotate only CH4 & CH5 common waveform. Waveform will be rotated with CH4 freq.
        ld  (98E0h),a
 
        ld  hl,Period
 
        ld  (9880h),hl
        ld  (9886h),hl     ; here CH4 restarts its play on emulators
        ld  (9888h),hl  ; here CH4 restarts its play on the real thing
IF 1
        ld  a,$20
        ld  (98E0h),a
ENDIF    
        ret    
 
 
 
;-------------------------------------
; Initialize replayer
;-------------------------------------
ReplayerInit:
        ld      hl,9800h
        ld      (WavePos),hl
        ld      hl,6000h
        ld      (SamplePos),hl
        ld      a,3
        ld      (SamplePage),a
        ld      (Bank2),a
        ret
 
 
;-------------------------------------
; Moves sample pointer to next page
;-------------------------------------
ReplayerNextPage:
        ld      hl,6000h
        push    af
        ld      a,(SamplePage)
        cp      (SAMPLE_END - SAMPLE_START + 1FFFh)/2000h
        jr      nz,.norewind
        ld      a,2
.norewind:
        inc     a
        ld      (SamplePage),a
        ld      (Bank2),a
        pop     af
        ret
 
ReplayerUpdate32:
        ld      hl,(SamplePos)
        ld      de,9800h
        ld      bc,16
        ldir
 
        push    bc
        ld      b,80
.wait:
        djnz    .wait
        pop     bc
 
        push    hl
        ld      hl,Period
        ld      (9880h),hl
        pop     hl
 
        ld      bc,16
        ldir
 
        bit     7,h
        call    nz,ReplayerNextPage
 
        ld      (SamplePos),hl
        ret
 
 
;-------------------------------------
; Updates the SCC wave table. This method updates
; the entire wave table
;-------------------------------------
ReplayerUpdate32_b:
        ld      bc,32
        ld      de,9800h
 
        ld      hl,9800h+32*3
        ld      a,28
.wait:
        cp      (hl)
        jp      nz,.wait
 
        ld      hl,(SamplePos)
 
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
 
        ld      b,100
.loop:
        djnz    .loop        
 
 
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
        ldi
 
        bit     7,h
        call    nz,ReplayerNextPage
 
        ld      (SamplePos),hl
        ret
 
 
 
 
 
;-------------------------------------
;   Powerup routine for non-Z180 code.
;   set pages and subslot
;-------------------------------------
powerup:
        call    0x138
        rrca
        rrca
        and     0x03
        ld      c,a
        ld      b,0
        ld      hl,0xfcc1
        add     hl,bc
        or      (hl)
        ld      b,a
        inc     hl
        inc     hl
        inc     hl
        inc     hl
        ld      a,(hl)
        and     0x0c
        or      b
 
        ld      h,0x80
        call    0x24
 
        ret
 
 
;-------------------------------------
; To make rom guesseres happy
;-------------------------------------
dummy:
        xor     a
        ld      (Bank1),a
        ld      (Bank3),a
        ld      (Bank1),a
        ld      (Bank3),a
        ret
 
 
WrtVdp:
        ld      a,b
        out     (99h),a
        ld      a,c
        or      80h
        nop
        out     (99h),a
        ret
 
VdpTest:
        ei
        ei
        halt
        di
 
        in      a,[99h]
        nop
        nop
        in      a,[99h]
        push    af
 
        ld      bc,$010f
        call    WrtVdp
        nop
        in      a,[99h]
        push    af
 
        ld      bc,$000f
        call    WrtVdp
 
        pop     af
        pop     bc
 
        sub     b
        ret
 
VdpRegs2:
db  $02,$a0,$06,$ff,$03,$36,$07,$0f
 
LoadIntro2:
        ld      bc,$a001
        call    WrtVdp
 
        ; Load 1st quarter
        ld      a,0
        out     (99h),a
        ld      a,40h
        nop
        nop
        out     (99h),a
        ld      hl,LOGO2_A
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_a:
        outi
        jp      nz,.loop_a
        dec     a
        jp      nz,.loop_a
 
        ; Load 2nd quarter
        ld      a,0
        out     (99h),a
        ld      a,60h
        nop
        nop
        out     (99h),a
        ld      hl,LOGO2_B
        ld      de,TempBase
        call    depack
 
        ld      bc,1800h
        ld      hl,TempBase
.cloop:
        ld      a,(hl)
        and     $f0
        jp      nz,.nofix1
        set     4,(hl)
.nofix1:
        ld      a,(hl)
        and     $0f
        jp      nz,.nofix2
        set     0,(hl)
.nofix2:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop        
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_b:
        outi
        jp      nz,.loop_b
        dec     a
        jp      nz,.loop_b
 
        ; Vdp register
        ld      hl,VdpRegs2
        ld      bc,1899h
        ld      a,80h
.loop:
        outi
        nop
        nop
        out     (c),a
        inc     a
        cp      88h
        jp      nz,.loop
 
        ld      bc,$e001
        call    WrtVdp
 
        ret
 
 
LoadScreen2:
        ld      bc,$a001
        call    WrtVdp
 
        ; Load 1st quarter
        ld      a,0
        out     (99h),a
        ld      a,40h
        nop
        nop
        out     (99h),a
        ld      hl,SC2_A
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_a:
        outi
        jp      nz,.loop_a
        dec     a
        jp      nz,.loop_a
 
        ; Load 2nd quarter
        ld      a,0
        out     (99h),a
        ld      a,60h
        nop
        nop
        out     (99h),a
        ld      hl,SC2_B
        ld      de,TempBase
        call    depack
 
        ld      bc,1800h
        ld      hl,TempBase
.cloop:
        ld      a,(hl)
        and     $f0
        jp      nz,.nofix1
        set     4,(hl)
.nofix1:
        ld      a,(hl)
        and     $0f
        jp      nz,.nofix2
        set     0,(hl)
.nofix2:
        ld      a,c
        dec     a
        cp      8
        jp      nc,.nofix3
        ld      a,$ff
        ld      (hl),a
.nofix3:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop        
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_b:
        outi
        jp      nz,.loop_b
        dec     a
        jp      nz,.loop_b
 
        ; Vdp register
        ld      hl,VdpRegs2
        ld      bc,1899h
        ld      a,80h
.loop:
        outi
        nop
        nop
        out     (c),a
        inc     a
        cp      88h
        jp      nz,.loop
 
        ld      bc,$e001
        call    WrtVdp
 
        ret
 
 
VdpRegsIntro7:
db  $06,$62,$1f,$80,$00,$ef,$ff,$07
db  $08,$80,$00,$00,$00,$01,$00,$00
db  $00,$90,$00,$00,$3b,$05,$00,$00
 
 
IF 0
db  $06,$60,$1f,$80,$01,$ef,$0f,$07
db  $08,$82,$00,$00,$00,$01,$00,$00
db  $00,$00,$00,$00,$3b,$05,$00,$00
ENDIF
 
PaletteIntro:
dw  $000,$444,$222,$666,$111,$555,$333,$777
dw  $000,$000,$000,$000,$000,$000,$000,$000
 
LoadIntro7:
        ld      bc,$a001
        call    WrtVdp
 
        ld      a,1
        ld      (Bank2),a
 
        ; Load 1st quarter
        ld      a,0
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,LOGO7_A
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_a:
        otir
        dec     a
        jp      nz,.loop_a
 
        ; Load 2nd quarter
        ld      a,0
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,LOGO7_B
        ld      de,TempBase
        call    depack
 
 
        ld      bc,2000h
        ld      hl,TempBase
.cloop:
        ld      a,(hl)
        and     $f0
        jp      nz,.nofix1
        set     7,(hl)
.nofix1:
        ld      a,(hl)
        and     $0f
        jp      nz,.nofix2
        set     3,(hl)
.nofix2:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop        
 
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_b:
        otir
        dec     a
        jp      nz,.loop_b
 
        ; Load 3rd quarter
        ld      a,1
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,LOGO7_C
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_c:
        otir
        dec     a
        jp      nz,.loop_c
 
        ; Load 4th quarter
        ld      a,1
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,LOGO7_D
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_d:
        otir
        dec     a
        jp      nz,.loop_d
 
        ; Vdp register
        ld      hl,VdpRegsIntro7
        ld      bc,1899h
        ld      a,80h
.loop:
        outi
        out     (c),a
        inc     a
        cp      98h
        jp      nz,.loop
 
 
        ld      bc,209Ah
        ld      hl,PaletteIntro
        otir
 
        ld      bc,$e001
        call    WrtVdp
 
        ret        
 
 
 
VdpRegs7:
db  $0a,$a0,$1f,$80,$00,$f7,$1e,$00
db  $08,$80,$00,$01,$00,$00,$03,$00
db  $00,$00,$00,$00,$3b,$05,$00,$00
 
Palette:
dw  $777,$441,$463,$476,$271,$111,$551,$434
dw  $352,$676,$471,$063,$122,$555,$333,$374
 
LoadScreen7:
        ld      bc,$a001
        call    WrtVdp
 
        ld      a,1
        ld      (Bank2),a
 
        ld      a,2
        ld      (Bank3),a
 
        ; Load 1st quarter
        ld      a,0
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,SC7_A
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_a:
        otir
        dec     a
        jp      nz,.loop_a
 
        ; Load 2nd quarter
        ld      a,0
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,SC7_B
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_b:
        otir
        dec     a
        jp      nz,.loop_b
 
        ; Load 3rd quarter
        ld      a,1
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,SC7_C
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_c:
        otir
        dec     a
        jp      nz,.loop_c
 
        ; Load 4th quarter
        ld      a,1
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,SC7_D
        ld      de,TempBase
        call    depack
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_d:
        otir
        dec     a
        jp      nz,.loop_d
 
        ld      a,2
        ld      (Bank2),a
 
        ; Load 5th quarter
        ld      a,4
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,SC7_E
        ld      de,TempBase
        call    depack
 
        ld      bc,2000h
        ld      hl,TempBase
.cloop_d:
        ld      a,l
        and     $7f
        cp      $7f
        jp      nz,.nofix_d
        ld      a,$00
        ld      (hl),a
.nofix_d:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop_d
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_e:
        otir
        dec     a
        jp      nz,.loop_e
 
        ; Load 6th quarter
        ld      a,4
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,SC7_F
        ld      de,TempBase
        call    depack
 
        ld      bc,2000h
        ld      hl,TempBase
.cloop_f:
        ld      a,l
        and     $7f
        cp      $7f
        jp      nz,.nofix_f
        ld      a,$00
        ld      (hl),a
.nofix_f:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop_f
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_f:
        otir
        dec     a
        jp      nz,.loop_f
 
        ; Load 7th quarter
        ld      a,5
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,40h
        out     (99h),a
        ld      hl,SC7_G
        ld      de,TempBase
        call    depack
 
        ld      bc,2000h
        ld      hl,TempBase
.cloop_g:
        ld      a,l
        and     $7f
        cp      $7f
        jp      nz,.nofix_g
        ld      a,$00
        ld      (hl),a
.nofix_g:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop_g
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_g:
        otir
        dec     a
        jp      nz,.loop_g
 
        ; Load 8th quarter
        ld      a,5
        out     (99h),a
        ld      a,8Eh
        out     (99h),a
        ld      a,0
        out     (99h),a
        ld      a,60h
        out     (99h),a
        ld      hl,SC7_H
        ld      de,TempBase
        call    depack
 
        ld      bc,2000h
        ld      hl,TempBase
.cloop_h:
        ld      a,l
        and     $7f
        cp      $7f
        jp      nz,.nofix_h
        ld      a,$00
        ld      (hl),a
.nofix_h:
        inc     hl
        dec     bc
        ld      a,b
        or      c
        jp      nz,.cloop_h
 
        ld      hl,TempBase
        ld      bc,0098h        
        ld      a,20h
.loop_h:
        otir
        dec     a
        jp      nz,.loop_h
 
 
        ; Vdp register
        ld      hl,VdpRegs7
        ld      bc,1899h
        ld      a,80h
.loop:
        outi
        out     (c),a
        inc     a
        cp      98h
        jp      nz,.loop
 
 
        ld      bc,209Ah
        ld      hl,Palette
        otir
 
        ld      bc,$e001
        call    WrtVdp
 
        ret        
 
include "bitbuster.asm"
 
SC2_A:
incbin "sc2_a.bin.pck"
SC2_B:
incbin "sc2_b.bin.pck"
 
LOGO2_A:
incbin "logo2_a.bin.pck"
LOGO2_B:
incbin "logo2_b.bin.pck"
 
;-------------------------------------
; Padding for rom player
;-------------------------------------
        DS (6000h - $)
 
LOGO7_A:
incbin "logo5_a.bin.pck"
LOGO7_B:
incbin "logo5_b.bin.pck"
LOGO7_C:
incbin "logo5_c.bin.pck"
LOGO7_D:
incbin "logo5_d.bin.pck"
 
SC7_A:
incbin "sc7_a.bin.pck"
SC7_B:
incbin "sc7_b.bin.pck"
SC7_C:
incbin "sc7_c.bin.pck"
SC7_D:
incbin "sc7_d.bin.pck"
 
SC7_E:
incbin "sc7_e.bin.pck"
SC7_F:
incbin "sc7_f.bin.pck"
SC7_G:
incbin "sc7_g.bin.pck"
SC7_H:
incbin "sc7_h.bin.pck"
 
        DS (0A000h - $)
 
;-------------------------------------
; Sample data
;-------------------------------------
SAMPLE_START:
;incbin "ll2.raw",0,7A000h
incbin "ll2.raw"
SAMPLE_END:
 
 
;-------------------------------------
; Padding, align rom image to a power of two.
;-------------------------------------
 
SAMPLE_LENGTH:  equ SAMPLE_END - SAMPLE_START
 
DS (7A000h - SAMPLE_LENGTH)
 
FINISH:
 
 
;---------------------------------------------------------
; Variables
;---------------------------------------------------------
 
TempBase:       equ $c000
 
VariableBase:   equ $e000
 
WavePos:        equ VariableBase + 0
SamplePos:      equ VariableBase + 2
SamplePage:     equ VariableBase + 4
 




Lâchez vous les gars. C'est noël avant l'heure :noel :noel :noel




Metalion :
Bon, j'ai analysé en vitesse les sources de LEILA K.



Les fichiers .pck sont des fichiers compressés par Bitbuster (compression LZ donc) qui ne contiennent que les éléments graphiques de la démo.

Le fichier .raw contient la source sonore à la fréquence d'échantillonnage 14466Hz, mais cette fréquence est modifiable dans les sources.



Le replayer fonctionne comme suit :

- il sélectionne une page de la ROM pour le bank 2 ($6000 - $7FFF)

- il envoie les données sur le premier canal de la SCC, par paquet de 32 octets

- quand il arrive à la fin de la page, il réinitialise le compteur et charge la page suivant dans le bank 2

- quand il arrive à la fin du morceau, il reboucle.



La difficulté en ce qui concerne la modification de la fréquence d'échantillonnage vient du fait qu'il faut synchroniser totalement le code avec la SCC. Autrement dit, il faut que lorsque la SCC a fini de jouer une première fois le sample (à la fréquence pré-définie), le code arrive juste à temps pour mettre à jour le sample avec les données suivantes avant que la SCC reboucle.



Il y a un peu de latitude (il y a une petite boucle d'attende djnz entre chaque mise à jour), mais je ne suis pas sur que l'on puisse aller très loin dans la fréquence d'échantillonnage (à vérifier).



En ce qui concerne la taille maximale du morceau, théoriquement, on peut avoir jusqu'à 254 pages de 8Kb (il faut en garder une pour le code et une pour la SCC). Donc 254x8=2032Kb, ce qui donne 144 secondes (2minutes 24 secondes) à la fréquence de 14466Hz.




Pour ceux qui connaissent pas:





Il ne manque plus qu'un connaisseur qui ait envi d'y passer du temps je crois ;)



Plus d'infos par ici => http://www.msxvillage.fr/forum/topic.php?id=1418&pt=1 Edité par igal Le 29/05/2013 à 00h23


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie