File: lsp_SCPCD.s - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

; LSP sur Jaguar
; version 4 bytes reading at once
;
; OK - routine de replay Paula en I2S
; OK - routine de replay Paula en Timer 1
; OK - convertir player LSP en Timer 1
; OK - g�rer le changement de bpm dans le timer 1
; OK - init : signed 8 bits samples => unsigned 8 bits samples
; OK - LSP Init : longueur sample en bytes
; OK - mettre en place la console
; OK - basculer tout en 21:11 :
; OK - lire 4 octets par 4 octets de sample / attention � l'alignement du sample, lire les premiers octets en loadb et/ou loadw !
; - optimiser lecture lsp etc dans Timer 1


; - Timer 1 pour gestion LSP
; - I2S pour replay samples
;
; calcul bpm: FRQ=24/(60/bpm)= => 125 bpm=50hz
;
; samples Amiga = 8 bits signed PCM

;CC (Carry Clear) = %00100
;CS (Carry Set)   = %01000
;EQ (Equal)       = %00010
;MI (Minus)       = %11000
;NE (Not Equal)   = %00001
;PL (Plus)        = %10100
;HI (Higher)      = %00101
;T (True)         = %00000

  include "jaguar.inc"


CLEAR_BSS     .equ      1                 ; 1=efface toute la BSS jusqu'a la fin de la ram utilis�e
LSP_DSP_Audio_frequence         .equ      45000       ; real hardware needs lower sample frequencies than emulators
nb_bits_virgule_offset          .equ      10

display_infos_debug       .equ      1
DSP_DEBUG           .equ      0
I2S_during_Timer1       .equ      0                 ; 0= I2S waits while timer 1 / 1=IMASK cleared while Timer 1
LSP_avancer_module        .equ      1               ; 1=incremente position dans le module

channel_1   .equ    1
channel_2   .equ    1
channel_3   .equ    1
channel_4   .equ    1

; ----------------------------
; parametres affichage
;ob_liste_originale     equ   (ENDRAM-$4000)              ; address of list (shadow)
ob_list_courante      equ   ((ENDRAM-$4000)+$2000)        ; address of read list
nb_octets_par_ligne     equ   320
nb_lignes         equ   256

curseur_Y_min   .equ    8


DSP_STACK_SIZE  equ 32  ; long words
DSP_USP     equ   (D_ENDRAM-(4*DSP_STACK_SIZE))
DSP_ISP     equ   (DSP_USP-(4*DSP_STACK_SIZE))


; DSP



.opt "~Oall"

.text



      .68000


  move.l    #INITSTACK, sp  
  move.w    #%0000011011000111, VMODE     ; 320x256
  move.w    #$100,JOYSTICK

; clear BSS

  .if     CLEAR_BSS=1
; clear BSS
  lea     DEBUT_BSS,a0
  lea     FIN_RAM,a1
  moveq   #0,d0
 
boucle_clean_BSS:
  move.b    d0,(a0)+
  cmp.l   a0,a1
  bne.s   boucle_clean_BSS
; clear stack
  lea     INITSTACK-100,a0
  lea     INITSTACK,a1
  moveq   #0,d0
 
boucle_clean_BSS2:
  move.b    d0,(a0)+
  cmp.l   a0,a1
  bne.s   boucle_clean_BSS2

; clear object list
  lea     ob_list_courante,a0
  lea     ENDRAM,a1
  moveq   #0,d0
 
boucle_clean_BSS3:
  move.b    d0,(a0)+
  cmp.l   a0,a1
  bne.s   boucle_clean_BSS3
  .endif

;check ntsc ou pal:

  moveq   #0,d0
  move.w    JOYBUTS ,d0

  move.l    #26593900,frequence_Video_Clock     ; PAL
  move.l    #415530,frequence_Video_Clock_divisee

 
  btst    #4,d0
  beq.s   jesuisenpal
jesuisenntsc:
  move.l    #26590906,frequence_Video_Clock     ; NTSC
  move.l    #415483,frequence_Video_Clock_divisee
jesuisenpal:


  move.l  #0,D_CTRL
; copie du code DSP dans la RAM DSP

  lea   YM_DSP_debut,A0
  lea   D_RAM,A1
  move.l  #YM_DSP_fin-DSP_base_memoire,d0
  lsr.l #2,d0
  sub.l #1,D0
boucle_copie_bloc_DSP:
  move.l  (A0)+,(A1)+
  dbf   D0,boucle_copie_bloc_DSP

; init LSP

  lea   LSP_module_music_data,a0
  lea   LSP_module_sound_bank,a1
  jsr   LSP_PlayerInit

;   Out :   a0: music BPM pointer (16bits).w
;       d0: music len in tick count

    bsr     InitVideo                 ; Setup our video registers.

  jsr     copy_olist                ; use Blitter to update active list from shadow

  move.l  #ob_list_courante,d0          ; set the object list pointer
  swap  d0
  move.l  d0,OLP

  lea   CLUT,a2
  move.l  #255-2,d7
  moveq #0,d0
 
copie_couleurs:
  move.w  d0,(a2)+
  addq.l  #5,d0
  dbf   d7,copie_couleurs

  lea   CLUT+2,a2
  move.w  #$F00F,(a2)+
 
  move.l  #VBL,LEVEL0       ; Install 68K LEVEL0 handler
  move.w  a_vde,d0                  ; Must be ODD
  sub.w   #16,d0
  ori.w   #1,d0
  move.w  d0,VI

  move.w  #%01,INT1                   ; Enable video interrupts 11101


  ;and.w   #%1111100011111111,sr        ; 1111100011111111 => bits 8/9/10 = 0
  and.w   #$f8ff,sr

; CLS
  moveq #0,d0
  bsr   print_caractere

; init DSP

  lea   chaine_LSP,a0
  bsr   print_string


; launch DSP

  move.l  #REGPAGE,D_FLAGS
  move.l  #DSP_routine_init_DSP,D_PC
  move.l  #DSPGO,D_CTRL
  move.l  #0,vbl_counter


; calcul RAM DSP
 
  lea     chaine_RAM_DSP,a0
  bsr     print_string
  move.l    #D_ENDRAM,d0
  sub.l   debut_ram_libre_DSP,d0
  bsr     print_nombre_4_chiffres
; ligne suivante
  moveq   #10,d0
  bsr     print_caractere



; on attend le DSP
  moveq #5,d7
.boucle_attente:
  move.l    vbl_counter,d0
.waitVBL2:
  move.l    vbl_counter,d1
  cmp.l   d0,d1
  beq   .waitVBL2
  dbf   d7,.boucle_attente


  move.w    #85,couleur_char




; replay frequency
  lea     chaine_replay_frequency,a0
  bsr     print_string

  move.l    DSP_frequence_de_replay_reelle_I2S,d0
  bsr     print_nombre_5_chiffres

  lea     chaine_Hz_init_LSP,a0
  bsr     print_string

  move.w    #145,couleur_char
 
  lea     chaine_playing_LSP,a0
  bsr     print_string
 
  move.w    #245,couleur_char

  lea     chaine_entete_debug_module,a0
  bsr     print_string



  .if     display_infos_debug=0
titi:   bra   titi
  .endif
toto:

; affiche les registres internes
  move.l  LSP_DSP_PAULA_internal_location0,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_increment0,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  #0,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_length0,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres

  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

  move.l  LSP_DSP_PAULA_internal_location1,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_increment1,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  #0,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_length1,d0
  bsr   print_nombre_hexa_8_chiffres


  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

  move.l  LSP_DSP_PAULA_internal_location2,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_increment2,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  #0,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_length2,d0
  bsr   print_nombre_hexa_8_chiffres


  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere



  move.l  LSP_DSP_PAULA_internal_location3,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_increment3,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  #0,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_internal_length3,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres


  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

; saute une ligne
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere


  lea     chaine_entete_debug_module2,a0
  bsr     print_string


; affiche les registres externes
  move.l  LSP_DSP_PAULA_AUD0L,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD0LEN,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD0PER,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD0VOL,d0
  bsr   print_nombre_hexa_8_chiffres
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

  move.l  LSP_DSP_PAULA_AUD1L,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD1LEN,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD1PER,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD1VOL,d0
  bsr   print_nombre_hexa_8_chiffres
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

  move.l  LSP_DSP_PAULA_AUD2L,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD2LEN,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD2PER,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD2VOL,d0
  bsr   print_nombre_hexa_8_chiffres
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere

  move.l  LSP_DSP_PAULA_AUD3L,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD3LEN,d0
  .if   nb_bits_virgule_offset<9
    lsr.l #nb_bits_virgule_offset,d0
  .else
    lsr.l #8,d0
    lsr.l #nb_bits_virgule_offset-8,d0
  .endif
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD3PER,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD3VOL,d0
  bsr   print_nombre_hexa_8_chiffres
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere
  ; ligne suivant
  moveq #10,d0
  bsr   print_caractere


  move.l  LSP_DSP_PAULA_AUD0DAT,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD1DAT,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD2DAT,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere
  move.l  LSP_DSP_PAULA_AUD3DAT,d0
  bsr   print_nombre_hexa_8_chiffres
  move.l  #' ',d0
  bsr   print_caractere

  .rept 11
  ; retour a la ligne  au dessus
  moveq #8,d0
  bsr   print_caractere
  .endr


  bra     toto

  stop    #$2700


;-----------------------------------------------------------------------------------
;--------------------------
; VBL

VBL:
                movem.l d0-d7/a0-a6,-(a7)
       
        .if   display_infos_debug=1
        ;add.w    #1,BG         ; debug pour voir si vivant
        .endif

                jsr     copy_olist                ; use Blitter to update active list from shadow

                addq.l  #1,vbl_counter

                move.w  #$101,INT1                ; Signal we're done
        move.w  #$0,INT2
.exit:
                movem.l (a7)+,d0-d7/a0-a6
                rte

; ---------------------------------------
; imprime une chaine termin�e par un z�ro
; a0=pointeur sur chaine
print_string:
  movem.l d0-d7/a0-a6,-(a7)

print_string_boucle:
  moveq #0,d0
  move.b  (a0)+,d0
  cmp.w #0,d0
  bne.s print_string_pas_fin_de_chaine
  movem.l (a7)+,d0-d7/a0-a6
  rts
print_string_pas_fin_de_chaine:
  bsr   print_caractere
  bra.s print_string_boucle

; ---------------------------------------
; imprime un nombre HEXA de 2 chiffres
print_nombre_hexa_2_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  lea   convert_hexa,a0
  move.l    d0,d1
  divu    #16,d0
  and.l   #$F,d0      ; limite a 0-15
  move.l    d0,d2
  mulu    #16,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  move.l    d1,d0
  and.l   #$F,d0      ; limite a 0-15
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts
 
convert_hexa:
  dc.b    48,49,50,51,52,53,54,55,56,57
  dc.b    65,66,67,68,69,70
  even
 
; ---------------------------------------
; imprime un nombre de 2 chiffres
print_nombre_2_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1
  divu    #10,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10,d2
  sub.l   d2,d1
  cmp.l   #0,d0
  beq.s   .zap
  add.l   #48,d0
  bsr     print_caractere
.zap:
  move.l    d1,d0
  add.l   #48,d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts

; ---------------------------------------
; imprime un nombre de 3 chiffres
print_nombre_3_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1

  divu    #100,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #100,d2
  sub.l   d2,d1
  cmp.l   #0,d0
  beq.s   .zap
  add.l   #48,d0
  bsr     print_caractere
.zap:
  move.l    d1,d0
  divu    #10,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere
 
  move.l    d1,d0
  add.l   #48,d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts


; ---------------------------------------
; imprime un nombre de 2 chiffres , 00
print_nombre_2_chiffres_force:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1
  divu    #10,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere
  move.l    d1,d0
  add.l   #48,d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts

; ---------------------------------------
; imprime un nombre de 4 chiffres HEXA
print_nombre_hexa_4_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1
  lea   convert_hexa,a0

  divu    #4096,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #4096,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #256,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #256,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere


  move.l    d1,d0
  divu    #16,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #16,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  move.l    d1,d0
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts

; ---------------------------------------
; imprime un nombre de 6 chiffres HEXA ( pour les adresses memoire)
print_nombre_hexa_6_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
 
  move.l    d0,d1
  lea   convert_hexa,a0

  move.l    d1,d0
  swap    d0
  and.l   #$F0,d0
  divu    #16,d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere

  move.l    d1,d0
  swap    d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere

  and.l   #$FFFF,d1
  move.l    d1,d0
  divu    #4096,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #4096,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #256,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #256,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere


  move.l    d1,d0
  divu    #16,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #16,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  move.l    d1,d0
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts

; ---------------------------------------
; imprime un nombre de 8 chiffres HEXA ( pour les adresses memoire et les donn�es en 16:16)
print_nombre_hexa_8_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
 
  move.l    d0,d1
  lea   convert_hexa,a0

  move.l    d1,d0
  swap    d0
  and.l   #$F000,d0
  divu    #4096,d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere



  move.l    d1,d0
  swap    d0
  and.l   #$F00,d0
  divu    #256,d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere


  move.l    d1,d0
  swap    d0
  and.l   #$F0,d0
  divu    #16,d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere

  move.l    d1,d0
  swap    d0
  and.l   #$F,d0
  move.b    (a0,d0.w),d0
  and.l   #$FF,d0
  bsr     print_caractere

  and.l   #$FFFF,d1
  move.l    d1,d0
  divu    #4096,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #4096,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #256,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #256,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere


  move.l    d1,d0
  divu    #16,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #16,d2
  sub.l   d2,d1
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  move.l    d1,d0
  move.b    (a0,d0.w),d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts


; ---------------------------------------
; imprime un nombre de 4 chiffres
print_nombre_4_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1

  divu    #1000,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #1000,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #100,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #100,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere


  move.l    d1,d0
  divu    #10,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere
  move.l    d1,d0
  add.l   #48,d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts

; ---------------------------------------
; imprime un nombre de 5 chiffres
print_nombre_5_chiffres:
  movem.l d0-d7/a0-a6,-(a7)
  move.l    d0,d1

  divu    #10000,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10000,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #1000,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #1000,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere

  move.l    d1,d0
  divu    #100,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #100,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere


  move.l    d1,d0
  divu    #10,d0
  and.l   #$FF,d0
  move.l    d0,d2
  mulu    #10,d2
  sub.l   d2,d1
  add.l   #48,d0
  bsr     print_caractere
  move.l    d1,d0
  add.l   #48,d0
  bsr     print_caractere
  movem.l (a7)+,d0-d7/a0-a6
  rts


; -----------------------------
; copie un caractere a l ecran
; d0.w=caractere

print_caractere:
  movem.l d0-d7/a0-a6,-(a7)



  cmp.b #00,d0
  bne.s print_caractere_pas_CLS
  move.l  #ecran1,A1_BASE     ; = DEST
  move.l  #$0,A1_PIXEL
  move.l  #PIXEL16|XADDPHR|PITCH1,A1_FLAGS
  move.l  #ecran1+320*100,A2_BASE     ; = source
  move.l  #$0,A2_PIXEL
  move.l  #PIXEL16|XADDPHR|PITCH1,A2_FLAGS
 
  move.w  #$00,B_PATD
 

  moveq #0,d0
  move.w  #nb_octets_par_ligne,d0
  lsr.w #1,d0
  move.w  #nb_lignes,d1
  mulu  d1,d0
  swap  d0
  move.w  #1,d0
  swap  d0
  ;move.w #65535,d0
  move.l  d0,B_COUNT
  move.l  #LFU_REPLACE|SRCEN|PATDSEL,B_CMD


  movem.l (a7)+,d0-d7/a0-a6
  rts
 
print_caractere_pas_CLS:

  cmp.b #10,d0
  bne.s print_caractere_pas_retourchariot
  move.w  #0,curseur_x
  add.w #8,curseur_y
  movem.l (a7)+,d0-d7/a0-a6
  rts

print_caractere_pas_retourchariot:
  cmp.b #09,d0
  bne.s print_caractere_pas_retourdebutligne
  move.w  #0,curseur_x
  movem.l (a7)+,d0-d7/a0-a6
  rts

print_caractere_pas_retourdebutligne:
  cmp.b #08,d0
  bne.s print_caractere_pas_retourdebutligneaudessus
  move.w  #0,curseur_x
  sub.w #8,curseur_y
  movem.l (a7)+,d0-d7/a0-a6
  rts


print_caractere_pas_retourdebutligneaudessus:

  lea   ecran1,a1
  moveq #0,d1
  move.w  curseur_x,d1
  add.l d1,a1
  moveq #0,d1
  move.w  curseur_y,d1
  mulu  #nb_octets_par_ligne,d1
  add.l d1,a1

  lsl.l #3,d0   ; * 8
  lea   fonte,a0
  add.l d0,a0
 
 
; copie 1 lettre
  move.l  #8-1,d0
copieC_ligne:
  moveq #8-1,d1
  move.b  (a0)+,d2
copieC_colonne:
  moveq #0,d4
  btst  d1,d2
  beq.s pixel_a_zero
  moveq #0,d4
  move.w  couleur_char,d4
pixel_a_zero:
  move.b  d4,(a1)+
  dbf   d1,copieC_colonne
  lea   nb_octets_par_ligne-8(a1),a1
  dbf   d0,copieC_ligne

  move.w  curseur_x,d0
  add.w #8,d0
  cmp.w #320,d0
  blt   curseur_pas_fin_de_ligne
  moveq #0,d0
  add.w #8,curseur_y
curseur_pas_fin_de_ligne:
  move.w  d0,curseur_x

  movem.l (a7)+,d0-d7/a0-a6

  rts


;----------------------------------
; recopie l'object list dans la courante

copy_olist:
        move.l  #ob_list_courante,A1_BASE     ; = DEST
        move.l  #$0,A1_PIXEL
        move.l  #PIXEL16|XADDPHR|PITCH1,A1_FLAGS
        move.l  #ob_liste_originale,A2_BASE     ; = source
        move.l  #$0,A2_PIXEL
        move.l  #PIXEL16|XADDPHR|PITCH1,A2_FLAGS
        move.w  #1,d0
        swap  d0
        move.l  #fin_ob_liste_originale-ob_liste_originale,d1
        move.w  d1,d0
        move.l  d0,B_COUNT
        move.l  #LFU_REPLACE|SRCEN,B_CMD
        rts


  .if     1=0
; ---------------------------------------
; allocation de m�moire
; malloc de d0, retour avec  un pointeur dans d0
; ---------------------------------------

YM_malloc:

  movem.l   d1-d3/a0,-(sp)

  move.l    debut_ram_libre,d1
  move.l    d1,a0
  move.l    d1,d3
; arrondit multiple de 2
    btst    #0,d0
  beq.s   YM_malloc_pas_d_arrondi
  addq.l    #1,d0
YM_malloc_pas_d_arrondi:
  add.l   d0,d1
  move.l    d1,debut_ram_libre
 
  move.l    d0,d2
  subq.l    #1,d2
  moveq.l   #0,d0

YM_malloc_boucle_clean_ram:
  move.b    d0,(a0)+
  dbf     d2,YM_malloc_boucle_clean_ram
 
  move.l    d3,d0

  movem.l   (sp)+,d1-d3/a0
  rts

; ---------------------------------------
; allocation de m�moire version RAM DSP
; malloc de d0, retour avec  un pointeur dans d0
; d0 => forc�ment un multiple de 4
; ---------------------------------------

YM_malloc_DSP:

  movem.l   d1-d3/a0,-(sp)

  move.l    debut_ram_libre_DSP,d1
  move.l    d1,a0
  move.l    d1,d3
  add.l   d0,d1
  move.l    d1,debut_ram_libre_DSP
 
  move.l    d0,d2
  moveq.l   #0,d0
  lsr.l   #2,d2   ; 4 octets par 4 octets
  subq.l    #1,d2

YM_malloc_boucle_clean_ram_DSP:
  move.l    d0,(a0)+
  dbf     d2,YM_malloc_boucle_clean_ram_DSP
 
  move.l    d3,d0

  movem.l   (sp)+,d1-d3/a0
  rts


  .endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Procedure: InitVideo (same as in vidinit.s)
;;            Build values for hdb, hde, vdb, and vde and store them.
;;

InitVideo:
                movem.l d0-d6,-(sp)

       
        move.w  #-1,ntsc_flag
        move.l  #50,_50ou60hertz
 
        move.w  CONFIG,d0                ; Also is joystick register
                andi.w  #VIDTYPE,d0              ; 0 = PAL, 1 = NTSC
                beq     .palvals
        move.w  #1,ntsc_flag
        move.l  #60,_50ou60hertz
 

.ntscvals:    move.w  #NTSC_HMID,d2
                move.w  #NTSC_WIDTH,d0

                move.w  #NTSC_VMID,d6
                move.w  #NTSC_HEIGHT,d4
       
                bra     calc_vals
.palvals:
        move.w #PAL_HMID,d2
        move.w #PAL_WIDTH,d0

        move.w #PAL_VMID,d6      
        move.w #PAL_HEIGHT,d4

       
calc_vals:    
                move.w  d0,width
                move.w  d4,height
                move.w  d0,d1
                asr     #1,d1                   ; Width/2
                sub.w   d1,d2                   ; Mid - Width/2
                add.w   #4,d2                   ; (Mid - Width/2)+4
                sub.w   #1,d1                   ; Width/2 - 1
                ori.w   #$400,d1                ; (Width/2 - 1)|$400
                move.w  d1,a_hde
                move.w  d1,HDE
                move.w  d2,a_hdb
                move.w  d2,HDB1
                move.w  d2,HDB2
                move.w  d6,d5
                sub.w   d4,d5
                add.w   #16,d5
                move.w  d5,a_vdb
                add.w   d4,d6
                move.w  d6,a_vde
     
          move.w  a_vdb,VDB
        move.w  a_vde,VDE    
       
       
        move.l  #0,BORD1                ; Black border
                move.w  #0,BG                   ; Init line buffer to black
                movem.l (sp)+,d0-d6
                rts

; ------------------------------------
;          LSP
; ------------------------------------


; ------------------------------------
; Init

LSP_PlayerInit:
; a0: music data (any mem)
; a1: sound bank data (chip mem)
; (a2: 16bit DMACON word address)

;   Out:a0: music BPM pointer (16bits)
;     d0: music len in tick count


      cmpi.l    #'LSP1',(a0)+
      bne     .dataError
      move.l    (a0)+,d0    ; unique id
      cmp.l   (a1),d0     ; check that sample bank is this one
      bne     .dataError

      lea     LSPVars,a3
      cmpi.w    #$0105,(a0)+      ; minimal major & minor version of latest compatible LSPConvert.exe    = V 1.05
      blt     .dataError

      moveq   #0,d6
      move.w    (a0)+,d6
      move.l    d6,m_currentBpm-LSPVars(a3)   ; default BPM
      move.l    d6,LSP_BPM_frequence_replay
      move.w    (a0)+,d6
      move.l    d6,m_escCodeRewind-LSPVars(a3)    ; tout en .L
      move.w    (a0)+,d6
      move.l    d6,m_escCodeSetBpm-LSPVars(a3)
      move.l    (a0)+,-(a7)
      ;move.l a2,m_dmaconPatch(a3)
      ;move.w #$8000,-1(a2)     ; Be sure DMACon word is $8000 (note: a2 should be ODD address)
      moveq   #0,d0
      move.w    (a0)+,d0        ; instrument count
      lea     -12(a0),a2        ; LSP data has -12 offset on instrument tab ( to win 2 cycles in fast player :) )
      move.l    a2,m_lspInstruments-LSPVars(a3) ; instrument tab addr ( minus 4 )
      subq.w    #1,d0
      move.l    a1,d1

.relocLoop:
      ;bset.b   #0,3(a0)        ; bit0 is relocation done flag
      ;bne.s    .relocated
     
      move.l    (a0),d6         ; pointeur sample
      add.l   d1,d6         ; passage de relatif en absolu
      ;lsl.l    #nb_bits_virgule_offset,d6
      move.l    d6,(a0)         ; pointeur sample

     
      moveq   #0,d6
      move.w    4(a0),d6        ; taille en words
      add.w   d6,d6
      move.w    d6,4(a0)        ; taille en bytes

      move.l    (a0),a4        
      bsr.s   LSP_unsigne_sample    ; A4=sample location / d6=length


      move.l    6(a0),d6          ; pointeur sample repeat
      add.l   d1,d6         ; passage de relatif en absolu
      ;lsl.l    #nb_bits_virgule_offset,d6
      move.l    d6,6(a0)          ; pointeur sample repeat
     
      moveq   #0,d6
      move.w    10(a0),d6       ; taille repeat en words
      add.w   d6,d6
      move.w    d6,10(a0)       ; taille repeat en bytes

.relocated:
      lea     12(a0),a0
      dbf     d0,.relocLoop
   
      move.w    (a0)+,d0        ; codes count (+2)
      move.l    a0,m_codeTableAddr-LSPVars(a3)  ; code table
      add.w   d0,d0
      add.w   d0,a0
      move.l    (a0)+,d0        ; word stream size
      move.l    (a0)+,d1        ; byte stream loop point
      move.l    (a0)+,d2        ; word stream loop point

      move.l    a0,m_wordStream-LSPVars(a3)
      lea     0(a0,d0.l),a1     ; byte stream
      move.l    a1,m_byteStream-LSPVars(a3)
      add.l   d2,a0
      add.l   d1,a1
      move.l    a0,m_wordStreamLoop-LSPVars(a3)
      move.l    a1,m_byteStreamLoop-LSPVars(a3)
      ;bset.b   #1,$bfe001        ; disabling this fucking Low pass filter!!
      lea     m_currentBpm-LSPVars(a3),a0
      move.l    (a7)+,d0        ; music len in frame ticks
      rts

.dataError: illegal

LSP_unsigne_sample:
; A4=sample location / d6=length
  movem.l   d0/d6/a4,-(sp)
  subq.l    #1,d6
  cmp.l   #0,d6
  blt.s   .quit
.boucle:
  move.b    (a4),d0       ; -128 to 127
  sub.b   #$80,d0
  move.b    d0,(a4)+
  dbf     d6,.boucle

.quit:
  movem.l   (sp)+,d0/d6/a4
  rts

 
 
  .text
 
;-------------------------------------
;
;     DSP
;
;-------------------------------------

  .phrase
YM_DSP_debut:

  .dsp
  .org  D_RAM
DSP_base_memoire:

; CPU interrupt
  .rept 8
    nop
  .endr
                                                                                  |-----------------------|-----------------------|--------------------------
                                                                                  | Cycle1  (read regs) | Cycle2  (compute) | Cycle3 (writeback)
                                                                                  |-----------------------|-----------------------|--------------------------
; I2S interrupt
  movei #DSP_LSP_routine_interruption_I2S,r28           ; 6 octets                                          | Rword1        | -         | -
                                                                                  | Rword2        | word1         | -
  movei #D_FLAGS,r30                      ; 6 octets                                            | Rword1        |   -         | word2word1 > Wr28
                                                                                  | Rword2        | word1         | -
  jump  (r28)                         ; 2 octets                                            | Rr28          | -         | word2word1 > Wr30
  load  (r30),r29 ; read flags                ; 2 octets = 16 octets                                      | Rr30          | r28 > WPC       | -
                                                                                  | -         | Read FLAGS      | -
                                                                                  |   (new instruction) | -         | Flags > Wr29
; Timer 1 interrupt
  movei #DSP_LSP_routine_interruption_Timer1,r12            ; 6 octets                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1         | -
  movei #D_FLAGS,r16                      ; 6 octets                                            | Rword1        |   -         | word2word1 > Wr12
                                                                                  | Rword2        | word1         | -
  jump  (r12)                         ; 2 octets                                            | Rr12          | -         | word2word1 > Wr16
  load  (r16),r13 ; read flags                ; 2 octets = 16 octets                                      | Rr16          | r12 > WPC       | -
                                                                                  | -         | Read FLAGS      | -
                                                                                  |   (new instruction) | -         | Flags > Wr13
; Timer 2 interrupt
  movei #DSP_LSP_routine_interruption_Timer2,r28            ; 6 octets                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1         | -
  movei #D_FLAGS,r30                      ; 6 octets                                            | Rword1        |   -         | word2&word1 > Wr28
                                                                                  | Rword2        | word1         | -
  jump  (r28)                         ; 2 octets                                            | Rflags  & Rr28    | -         | word2&word1 > Wr30
  load  (r30),r29 ; read flags                ; 2 octets = 16 octets                                      | Rr30          | r28 > WPC       | -
                                                                                  | -         | Read FLAGS      | -
                                                                                  |   (new instruction) | -         | Flags > Wr29
; External 0 interrupt
  .rept 8
    nop
  .endr
; External 1 interrupt
  .rept 8
    nop
  .endr













; -------------------------------
; DSP : routines en interruption
; -------------------------------
; utilis�s :  R29/R30/R31
;         R18/R19/R20/R21 /R22/R23/R24/R25/R26/R27/R28


; I2S : replay sample
; - version simple, lit un octet � chaque fois
; - puis version plus compleque : lit 1 long, et utilise ses octets
DSP_LSP_routine_interruption_I2S:

  .if   DSP_DEBUG
; change la couleur du fond
  movei #$777,R26                                                                       | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei #BG,r27                                                                         | Rword1        | -         | word2word1 > Wr26
                                                                                  | Rword2        | word1       | -
  storew  r26,(r27)                                                                       | Rr26  & Rr27      | -         | word2word1 > Wr27
  .endif


; version complexe avec stockage de 4 octets
; channel 3
    movei   #LSP_DSP_PAULA_internal_location3,R28           ; adresse sample actuelle, a virgule                        | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
    movei   #LSP_DSP_PAULA_internal_increment3,R27                                                      | Rword1        | -         | word2word1 > Wr28
                                                                                  | Rword2        | word1       | -
    load    (R28),R26                   ; R26=current pointeur sample 16:16                               | Rr28          | -         | word2word1 > Wr27
    load    (R27),R27                   ; R27=increment 16:16                                     | Rr27          | Mr28        | -
                                                                                  | -           | Mr27        | Wr26
    move    R26,R17                     ; R17 = pointeur sample a virgule avant increment                       | Rr26          | -         | Wr27
    movei   #LSP_DSP_PAULA_internal_length3,R25       ; =FIN                                              | Rword1        | -         | Wr17
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr25
    add     R27,R26                     ; R26=adresse+increment , a virgule                               | Rr27  & Rr26      | -         | -
    load    (R25),R23                                                                   | Rr25          | Cr26        | -
    movei   #$FFFFFFFC,R22                                                                  | Rword1        | Mr25        | Wr26
                                                                                  | Rword2        | word1       | Wr23
                                                                                  | -           | -         | word2word1 > Wr22
    cmp     R23,R26                                                                     | Rr23  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3                                          | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; fin de sample => on recharge les infos des registres externes
    shlq    #32-nb_bits_virgule_offset,R26                                                          | Rr26          | -         | -
    movei   #LSP_DSP_PAULA_AUD3LEN,R27      ; fin, a virgule                                              | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    shrq    #32-nb_bits_virgule_offset,R26    ; on ne garde que la virgule                                        | Rr26          | -         | word2word1 > Wr27
    movei   #LSP_DSP_PAULA_AUD3L,R24      ; sample location a virgule                                         | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    load    (R27),R27                                                                   | Rr27          | -         | word2word1 > Wr24
    load    (R24),R23                                                                   | Rr24          | Mr27        | -
    store   R27,(R25)             ; update internal sample end, a virgule                                   | Rr27  & Rr25      | Mr24        | Wr27
    or      R23,R26               ; on garde la virgule en cours                                        | Rr23  & Rr26      | Mr25        | Wr23
                                                                                  | -           | Cr26        | MWrite
DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel3:
    store   R26,(R28)             ; stocke internal sample pointeur, a virgule                                | Rr26  & Rr28      | -         | Wr26
    shrq    #nb_bits_virgule_offset,R26               ; nouveau pointeur adresse sample partie entiere                    | Rr26          | Mr28        | -
    shrq    #nb_bits_virgule_offset,R17               ; ancien pointeur adresse sample partie entiere                     | Rr17          | Cr26        | MWrite
                                                                                  | -           | Cr17        | Wr26
    move    R26,R25               ; R25 = nouveau pointeur sample                                       | Rr26          | -         | Wr17
                                                                                  | -           | -         | Wr25
    and     R22,R17               ; ancien pointeur sample modulo 4                                     | Rr22  & Rr17      | -         | -
    and     R22,R26               ; nouveau pointeur sample modulo 4                                      | Rr22  & Rr26      | Cr17        | -
    movei   #LSP_DSP_PAULA_AUD3DAT,R28      ; 4 octets actuels                                              | Rword1        | Cr26        | Wr17
                                                                                  | Rword2        | word1       | Wr26
    not     R22                 ; => %11                                                  | Rr22          | -         | word2word1 > Wr28
    load    (R28),R21             ; R21 = octets actuels en stock                                       | Rr28          | Cr22        | -
    and     R22,R25               ; R25 = position octet � lire                                       | Rr22          | Mr28        | Wr22
                                                                                  | -           | Cr25        | Wr21
                                                                                  | -           | -         | Wr25
    cmp     R17,R26                                                                     | Rr17  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3                                            | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; il faut rafraichir R21
    load    (R26),R21             ; lit 4 nouveaux octets de sample                                     | Rr26          | -         | -
                                                                                  | -           | Mr26        | -
    store   R21,(R28)             ; rafraichit le stockage des 4 octets                                   | Rr21  & Rr28      | -         | Wr21

DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word3:
    shlq    #3,R25          ; numero d'octet � lire * 8                                               | Rr25          | Mr28        | -
    movei   #LSP_DSP_PAULA_AUD3VOL,R23                                                            | Rword1        | Cr25        | Mwrite
                                                                                  | Rword2        | word1       | Wr25
    neg     R25                 ; -0 -8 -16 -24                                               | Rr25          | -         | word2word1 > Wr23
                                                                                  | -           | Cr25        | -
; R25=numero d'octet � lire
    sh      R25,R21               ; shift les 4 octets en stock vers la gauche, pour positionner l'octet � lire en haut           | Rr25  & Rr21      | -         | Wr25
    load    (R23),R23             ; R23 = volume : 6 bits                                           | Rr23          | Cr21        | -
    shrq    #24,R21               ; descends l'octet � lire                                         | Rr21          | Mr23        | Wr21
                                                                                  | -           | Cr21        | Wr23
    mult    R23,R21               ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits              | Rr23  & Rr21      | -         | Wr21

; R21=sample channel 3 on 14 bits

; channel 2
    movei   #LSP_DSP_PAULA_internal_location2,R28           ; adresse sample actuelle, a virgule                        | Rword1        | Cr21        | -
                                                                                  | Rword2        | word1       | Wr21
    movei   #LSP_DSP_PAULA_internal_increment2,R27                                                      | Rword1        | -         | word2word1 > Wr28
                                                                                  | Rword2        | word1       | -
    load    (R28),R26                   ; R26=current pointeur sample 16:16                               | Rr28          | -         | word2word1 > Wr27
    load    (R27),R27                   ; R27=increment 16:16                                     | Rr27          | Mr28        | -
                                                                                  | -           | Mr27        | Wr26
    move    R26,R17                     ; R17 = pointeur sample a virgule avant increment                       | Rr26          | -         | Wr27
    movei   #LSP_DSP_PAULA_internal_length2,R25       ; =FIN                                              | Rword1        | -         | Wr17
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr25
    add     R27,R26                     ; R26=adresse+increment , a virgule                               | Rr27  & Rr26      | -         | -
    load    (R25),R23                                                                   | Rr25          | Cr26        | -
    movei   #$FFFFFFFC,R22                                                                  | Rword1        | Mr25        | Wr26
                                                                                  | Rword2        | word1       | Wr23
                                                                                  | -           | -         | word2word1 > Wr22
    cmp     R23,R26                                                                     | Rr23  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel2                                          | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; fin de sample => on recharge les infos des registres externes
    shlq    #32-nb_bits_virgule_offset,R26                                                          | Rr26          | -         | -
    movei   #LSP_DSP_PAULA_AUD2LEN,R27      ; fin, a virgule                                              | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    shrq    #32-nb_bits_virgule_offset,R26    ; on ne garde que la virgule                                        | Rr26          | -         | word2word1 > Wr27
    movei   #LSP_DSP_PAULA_AUD2L,R24      ; sample location a virgule                                         | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    load    (R27),R27                                                                   | Rr27          | -         | word2word1 > Wr24
    load    (R24),R23                                                                   | Rr24          | Mr27        | -
    store   R27,(R25)             ; update internal sample end, a virgule                                   | Rr27          | Mr24        | Wr27
    or      R23,R26               ; on garde la virgule en cours                                        | Rr23  & Rr26      | Mr25        | Wr23
                                                                                  | -           | Cr26        | MWrite
DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel2:
    store   R26,(R28)             ; stocke internal sample pointeur, a virgule                                | Rr26  & Rr28      | -         | Wr26
    shrq    #nb_bits_virgule_offset,R26               ; nouveau pointeur adresse sample partie entiere                    | Rr26          | Mr28        | -
    shrq    #nb_bits_virgule_offset,R17               ; ancien pointeur adresse sample partie entiere                     | Rr17          | Cr26        | MWrite
                                                                                  | -           | Cr17        | Wr26
    move    R26,R25               ; R25 = nouveau pointeur sample                                       | Rr26          | -         | Wr17
                                                                                  | -           | -         | Wr25
    and     R22,R17               ; ancien pointeur sample modulo 4                                     | Rr22  & Rr17      | -         | -
    and     R22,R26               ; nouveau pointeur sample modulo 4                                      | Rr22  & Rr26      | Cr17        | -
    movei   #LSP_DSP_PAULA_AUD2DAT,R28      ; 4 octets actuels                                              | Rword1        | Cr26        | Wr17
                                                                                  | Rword2        | word1       | Wr26
    not     R22                 ; => %11                                                  | Rr22          | -         | word2word1 > Wr28
    load    (R28),R20             ; R20 = octets actuels en stock                                       | Rr28          | Cr22        | -
    and     R22,R25               ; R25 = position octet � lire                                       | Rr22  & Rr25      | Mr28        | Wr22
                                                                                  | -           | Cr25        | Wr20
                                                                                  | -           | -         | Wr25
    cmp     R17,R26                                                                     | Rr17  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word2                                            | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; il faut rafraichir R20
    load    (R26),R20             ; lit 4 nouveaux octets de sample                                     | Rr26          | -         | -
                                                                                  | -           | Mr26        | -
    store   R20,(R28)             ; rafraichit le stockage des 4 octets                                   | Rr20  & Rr28      | -         | Wr20

DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word2:
    shlq    #3,R25          ; numero d'octet � lire * 8                                               | Rr25          | Mr28        | -
    movei   #LSP_DSP_PAULA_AUD2VOL,R23                                                            | Rword1        | Cr25        | MWrite
                                                                                  | Rword2        | word1       | Wr25
    neg     R25                 ; -0 -8 -16 -24                                               | Rr25          | -         | word2word1 > Wr23
                                                                                  | -           | Cr25        | -
; R25=numero d'octet � lire
    sh      R25,R20               ; shift les 4 octets en stock vers la gauche, pour positionner l'octet � lire en haut           | Rr25  & Rr20      | -         | Wr25
    load    (R23),R23             ; R23 = volume : 6 bits                                           | Rr23          | Cr20        | -
    shrq    #24,R20               ; descends l'octet � lire                                         | Rr20          | Mr23        | Wr20
                                                                                  | -           | Cr20        | Wr23
    mult    R23,R20               ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits              | Rr23  & Rr20      | -         | Wr20

; R20=sample channel 2 on 14 bits

; channel 1
    movei   #LSP_DSP_PAULA_internal_location1,R28           ; adresse sample actuelle, a virgule                        | Rword1        | Cr20        | -
                                                                                  | Rword2        | word1       | Wr20
    movei   #LSP_DSP_PAULA_internal_increment1,R27                                                      | Rword1        | -         | word2word1 > Wr28
                                                                                  | Rword2        | word1       | -
    load    (R28),R26                   ; R26=current pointeur sample 16:16                               | Rr28          | -         | word2word1 > Wr27
    load    (R27),R27                   ; R27=increment 16:16                                     | Rr27          | Mr28        | -
                                                                                  | -           | Mr27        | Wr26
    move    R26,R17                     ; R17 = pointeur sample a virgule avant increment                       | Rr26          | -         | Wr27
    movei   #LSP_DSP_PAULA_internal_length1,R25       ; =FIN                                              | Rword1        | -         | Wr17
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr25
    add     R27,R26                     ; R26=adresse+increment , a virgule                               | Rr27  & Rr26      | -         | -
    load    (R25),R23                                                                   | Rr25          | Cr26        | -
    movei   #$FFFFFFFC,R22                                                                  | Rword1        | Mr25        | Wr26
                                                                                  | Rword2        | word1       | Wr23
                                                                                  | -           | -         | word2word1 > Wr22
    cmp     R23,R26                                                                     | Rr23  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel1                                          | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; fin de sample => on recharge les infos des registres externes
    shlq    #32-nb_bits_virgule_offset,R26                                                          | Rr26          | -         | -
    movei   #LSP_DSP_PAULA_AUD1LEN,R27      ; fin, a virgule                                              | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    shrq    #32-nb_bits_virgule_offset,R26    ; on ne garde que la virgule                                        | Rr26          | -         | word2word1 > Wr27
    movei   #LSP_DSP_PAULA_AUD1L,R24      ; sample location a virgule                                         | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    load    (R27),R27                                                                   | Rr27          | -         | word2word1 > Wr24
    load    (R24),R23                                                                   | Rr24          | Mr27        | -
    store   R27,(R25)             ; update internal sample end, a virgule                                   | Rr27  & Rr25      | Mr23        | Wr27
    or      R23,R26               ; on garde la virgule en cours                                        | Rr22  & Rr26      | Mr25        | Wr23
                                                                                  | -           | Cr26        | MWrite
   
DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel1:
    store   R26,(R28)             ; stocke internal sample pointeur, a virgule                                | Rr26  & Rr28      | -         | Wr26
    shrq    #nb_bits_virgule_offset,R26               ; nouveau pointeur adresse sample partie entiere                    | Rr26          | Mr28        | -
    shrq    #nb_bits_virgule_offset,R17               ; ancien pointeur adresse sample partie entiere                     | Rr17          | Cr26        | MWrite
                                                                                  | -           | Cr17        | Wr26
    move    R26,R25               ; R25 = nouveau pointeur sample                                       | Rr26          | -         | Wr17
                                                                                  | -           | -         | Wr25
    and     R22,R17               ; ancien pointeur sample modulo 4                                     | Rr22  & Rr17      | -         | -
    and     R22,R26               ; nouveau pointeur sample modulo 4                                      | Rr22  & Rr26      | Cr17        | -
    movei   #LSP_DSP_PAULA_AUD1DAT,R28      ; 4 octets actuels                                              | Rword1        | Cr26        | Wr17
                                                                                  | Rword2        | word1       | Wr26
    not     R22                 ; => %11                                                  | Rr22          | -         | word2word1 > Wr28
    load    (R28),R19             ; R19 = octets actuels en stock                                       | Rr28          | Cr22        | -
    and     R22,R25               ; R25 = position octet � lire                                       | Rr22  & Rr25      | Mr28        | Wr22
                                                                                  | -           | Cr25        | Wr19
                                                                                  | -           | -         | Wr25
    cmp     R17,R26                                                                     | Rr17  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word1                                            | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; il faut rafraichir R19
    load    (R26),R19             ; lit 4 nouveaux octets de sample                                     | Rr26          | -         | -
                                                                                  | -           | Mr26        | -
    store   R19,(R28)             ; rafraichit le stockage des 4 octets                                   | Rr19  & Rr28      | -         | Wr19

DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word1:
    shlq    #3,R25          ; numero d'octet � lire * 8                                               | Rr25          | Mr28        | -
    movei   #LSP_DSP_PAULA_AUD1VOL,R23                                                            | Rword1        | Cr25        | Mwrite
                                                                                  | Rword2        | word1       | Wr25
    neg     R25                 ; -0 -8 -16 -24                                               | Rr25          | -         | word2word1 > Wr23
                                                                                  | -           | Cr25        | -
; R25=numero d'octet � lire
    sh      R25,R19               ; shift les 4 octets en stock vers la gauche, pour positionner l'octet � lire en haut           | Rr25  & Rr19      | -         | Wr25
    load    (R23),R23             ; R23 = volume : 6 bits                                           | Rr23          | Cr19        | -
    shrq    #24,R19               ; descends l'octet � lire                                         | Rr19          | Mr23        | Wr19
                                                                                  | -           | Cr19        | Wr23
    mult    R23,R19               ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits              | Rr23  & Rr19      | -         | Wr19
   
; R19=sample channel 1 on 14 bits

; channel 0
    movei   #LSP_DSP_PAULA_internal_location0,R28           ; adresse sample actuelle, a virgule                        | Rword1        | Cr19        | -
                                                                                  | Rword2        | word1       | Wr19
    movei   #LSP_DSP_PAULA_internal_increment0,R27                                                      | Rword1        | -         | word2word1 > Wr28
                                                                                  | Rword2        | word1       | -
    load    (R28),R26                   ; R26=current pointeur sample 16:16                               | Rr28          | -         | word2word1 > Wr27
    load    (R27),R27                   ; R27=increment 16:16                                     | Rr27          | Mr28        | -
                                                                                  | -           | Mr27        | Wr26
    move    R26,R17                     ; R17 = pointeur sample a virgule avant increment                       | Rr26          | -         | Wr27
    movei   #LSP_DSP_PAULA_internal_length0,R25       ; =FIN                                              | Rword1        | -         | Wr17
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr25
    add     R27,R26                     ; R26=adresse+increment , a virgule                               | Rr27  & Rr26      | -         | -
    load    (R25),R23                                                                   | Rr25          | Cr26        | -
    movei   #$FFFFFFFC,R22                                                                  | Rword1        | Mr25        | Wr26
                                                                                  | Rword2        | word1       | Wr23
                                                                                  | -           | -         | word2word1 > Wr22
    cmp     R23,R26                                                                     | Rr23  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      mi,DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel0                                          | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; fin de sample => on recharge les infos des registres externes
    shlq    #32-nb_bits_virgule_offset,R26                                                          | Rr26          | -         | -
    movei   #LSP_DSP_PAULA_AUD0LEN,R27      ; fin, a virgule                                              | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    shrq    #32-nb_bits_virgule_offset,R26    ; on ne garde que la virgule                                        | Rr26          | -         | word2word1 > Wr27
    movei   #LSP_DSP_PAULA_AUD0L,R24      ; sample location a virgule                                         | Rword1        | Cr26        | -
                                                                                  | Rword2        | word1       | Wr26
    load    (R27),R27                                                                   | Rr27          | -         | word2word1 > Wr24
    load    (R24),R23                                                                   | Rr24          | Mr27        | -
    store   R27,(R25)             ; update internal sample end, a virgule                                   | Rr27  & Rr25      | Mr24        | Wr27
    or      R23,R26               ; on garde la virgule en cours                                        | Rr23  & Rr26      | Mr25        | Wr23
                                                                                  | -           | Cr26        | Mwrite
DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel0:
    store   R26,(R28)             ; stocke internal sample pointeur, a virgule                                | Rr26  & Rr28      | -         | Wr26
    shrq    #nb_bits_virgule_offset,R26               ; nouveau pointeur adresse sample partie entiere                    | Rr26          | Mr28        | -
    shrq    #nb_bits_virgule_offset,R17               ; ancien pointeur adresse sample partie entiere                     | Rr17          | Cr26        | -
                                                                                  | -           | Cr17        | Wr26
    move    R26,R25               ; R25 = nouveau pointeur sample                                       | Rr26          | -         | Wr17
                                                                                  | -           | -         | Wr25
    and     R22,R17               ; ancien pointeur sample modulo 4                                     | Rr22  & Rr17      | -         | -
    and     R22,R26               ; nouveau pointeur sample modulo 4                                      | Rr22  & Rr26      | Cr17        | -
    movei   #LSP_DSP_PAULA_AUD0DAT,R28      ; 4 octets actuels                                              | Rword1        | Cr26        | Wr17
                                                                                  | Rword2        | word1       | Wr26
    not     R22                 ; => %11                                                  | Rr22          | -         | word2word1 > Wr28
    load    (R28),R18             ; R18 = octets actuels en stock channel 0                                 | Rr28          | Cr22        | -
    and     R22,R25               ; R25 = position octet � lire                                       | Rr22  & Rr25      | Mr28        | Wr22
                                                                                  | -           | Cr25        | Wr18
                                                                                  | -           | -         | Wr25
    cmp     R17,R26                                                                     | Rr17  & Rr26      | -         | -
                                                                                  | -           | Cflags        | -
    jr      eq,DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word0                                            | Rflags        | -         | Wflags
    nop                                                                             | -           | ? > WPC       | -
; il faut rafraichir R18
    load    (R26),R18             ; lit 4 nouveaux octets de sample                                     | Rr26          | -         | -
                                                                                  | -           | Mr26        | -
    store   R18,(R28)             ; rafraichit le stockage des 4 octets                                   | Rr18  & Rr28      | -         | Wr18

DSP_LSP_routine_interruption_I2S_pas_nouveau_long_word0:
    shlq    #3,R25          ; numero d'octet � lire * 8                                               | Rr25          | Mr28        | -
    movei   #LSP_DSP_PAULA_AUD0VOL,R23                                                            | Rword1        | Cr25        | MWrite
                                                                                  | Rword2        | word1       | Wr25
    neg     R25                 ; -0 -8 -16 -24                                               | Rr25          | -         | word2word1 > Wr23
                                                                                  | -           | Cr25        | -
; R25=numero d'octet � lire
    sh      R25,R18               ; shift les 4 octets en stock vers la gauche, pour positionner l'octet � lire en haut           | Rr25  & Rr18      | -         | Wr25
    load    (R23),R23             ; R23 = volume : 6 bits                                           | Rr23          | Cr18        | -
    shrq    #24,R18               ; descends l'octet � lire                                         | Rr18          | Mr23        | Wr18
                                                                                  | -           | Cr18        | Wr23
    mult    R23,R18               ; unsigned multiplication : unsigned sample * volume => 8bits + 6 bits = 14 bits              | Rr23  & Rr18      | -         | Wr18
   
; R18=sample channel 0 on 14 bits



; St�reo Amiga:
; les canaux 0 et 3 formant la voie st�r�o gauche et 1 et 2 la voie st�r�o droite
; R18=channel 0
; R19=channel 1
; R20=channel 2
; R21=channel 3
    .if     channel_1=0
      moveq #0,R18
    .endif
    .if     channel_2=0
      moveq #0,R19
    .endif
    .if     channel_3=0
      moveq #0,R20
    .endif
    .if     channel_4=0
      moveq #0,R21
    .endif

    movei   #$8000,R26                                                                    | Rword1        | Cr18        | -
                                                                                  | Rword2        | word1       | Wr18
                                                                                  | -           | -         | word2word1 > Wr26
    add     R21,R18       ; R18 = left 15 bits unsigned                                               | Rr21  & Rr18      | -         | -
    movei   #L_I2S,R27                                                                    | Rword1        | Cr18        | -
                                                                                  | Rword2        | word1       | Wr18
                                                                                  | -           | -         | word2word1 > Wr27
    add     R20,R19       ; R19 = right 15 bits unsigned                                                | Rr20  & Rr19      | -         | -
    shlq    #1,R18        ; 16 bits unsigned                                                      | Rr18          | Cr19        | -
    shlq    #1,R19                                                                      | Rr19          | Cr18        | Wr19
    sub     R26,R18       ; 16 bits signed                                                      | Rr26  & Rr18      | Cr19        | Wr18
    movei   #L_I2S+4,R25                                                                  | Rword1        | Cr18        | Wr19
                                                                                  | Rword2        | word1       | Wr18
                                                                                  | -           | -         | word2word1 > Wr25
    sub     R26,R19                                                                     | Rr26  & Rr19      | -         | -
                                                                                  | -           | Cr19        | -
    store   R19,(R27)     ; write right channel                                                   | Rr19  & Rr27      | -         | Wr19
    store   R18,(R25)     ; write left channel                                                    | Rr18  & Rr25      | Mr27        | -

   

  .if   DSP_DEBUG
; change la couleur du fond
  movei #$000,R26
  movei #BG,r27
  storew  r26,(r27)
  .endif


;------------------------------------
; return from interrupt I2S
  load  (r31),r28 ; return address                                                              | Rr31          | Mr25        | MWrite
  bset  #10,r29   ; clear latch 1 = I2S                                                           | Rr29          | Mr31        | MWrite
                                                                                  | -           | Cr29        | Wr28
  ;bset #11,r29   ; clear latch 1 = timer 1
  ;bset #12,r29   ; clear latch 1 = timer 2
  bclr  #3,r29    ; clear IMASK                                                               | Rr29          | -         | Wr29
  addq  #4,r31    ; pop from stack                                                              | Rr31          | Cr29        | -
  addqt #2,r28    ; next instruction                                                              | Rr28          | Cr31        | Wr29
                                                                                  | -           | Cr28        | Wr31
  jump  t,(r28)   ; return                                                                  | Rr28          | -         | Wr28
  store r29,(r30) ; restore flags                                                               | Rr29    & Rr30    | ? > WPC       | -


;--------------------------------------------
; ---------------- Timer 1 ------------------
;--------------------------------------------
; autorise interruptions, pour timer I2S
;
; registres utilis�s :
;   R13/R16   /R31
;   R0/R1/R2/R3/R4/R5/R6/R7/R8/R9  R12/R14


DSP_LSP_routine_interruption_Timer1:
  .if   I2S_during_Timer1=1
  bclr  #3,r13    ; clear IMASK
  store r13,(r16) ; restore flags
  .endif

; gestion replay LSP

  movei   #LSPVars,R14                                                                    | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  load    (R14),R0          ; R0 = byte stream                                                    | Rr14          | -         | word2word1 > Wr14
                                                                                  | -           | Mr14        | -
DSP_LSP_Timer1_process:
  moveq   #0,R2                                                                       | #0          | -         | Wr0
DSP_LSP_Timer1_cloop:

  loadb   (R0),R6           ; R6 = byte code                                                    | Rr0         | -         | Wr2
  addq    #1,R0                                                                       | Rr0         | Mr0         | -
 
  cmpq    #0,R6                                                                       | Rr6         | -         | Wr6
                                                                                  | -           | Cflags        | -
  jr      ne,DSP_LSP_Timer1_swCode                                                              | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  movei   #$0100,R3                                                                     | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  add     R3,R2                                                                       | Rr3 & Rr2     | -         | word2word1 > Wr3
  jr      DSP_LSP_Timer1_cloop                                                                | -           | Cr2         | -
  nop                                                                               | -           | WPC         | -

DSP_LSP_Timer1_swCode:
  add     R2,R6                                                                       | Rr2 & Rr6     | -         | -
                                                                                  | -           | Cr6         | -
  move    R6,R2                                                                       | Rr6         | -         | Wr6

  add     R2,R2                                                                       | Rr2         | -         | Wr2
  load    (R14+2),R3      ; R3=code table / m_codeTableAddr                                               | Rr14          | Cr2         | -
                                                                                  | -           | Cr14+2        | Wr2
                                                                                  | -           |     Mr14+2    | -
  add     R2,R3                                                                       | Rr2 & Rr3     | -         | Wr3
  movei   #DSP_LSP_Timer1_noInst,R12                                                              | Rword1        | Cr3         | -
                                                                                  | Rword2        | word1       | -
  loadw   (R3),R2                 ; R2 = code                                                 | Rr3         | -         | word2word1 > Wr12
                                                                                  | -           | Mr3         | -
  cmpq    #0,R2                                                                       | Rr2         | -         | Wr2
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  load    (R14+3),R4      ; R4=escape code rewind / m_escCodeRewind                                           | Rr14          | -         | -
                                                                                  | -           | Cr14+3        | -
  movei   #DSP_LSP_Timer1_r_rewind,R12                                                            | Rword1        | -   Mr14+3    | -
                                                                                  | Rword2        | word1       | Wr4
                                                                                  | -           | -         | word2word1 > Wr12
  cmp     R4,R2                                                                       | Rr4 & Rr2     | -         | -
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  load    (R14+4),R4      ; R4=escape code set bpm / m_escCodeSetBpm                                            | Rr14          | -         | -
                                                                                  | -           | Cr14+4        | -
  movei   #DSP_LSP_Timer1_r_chgbpm,R12                                                            | Rword1        | -   Mr14+4    | -
                                                                                  | Rword2        | word1       | Wr4
                                                                                  | -           | -         | word2word1 > Wr12
  cmp     R4,R2                                                                       | Rr4 & Rr2     | -         | -
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -

;--------------------------
; gestion des volumes
;--------------------------
; test volume canal 3
  btst    #7,R2                                                                       | Rr2         | -         | -
                                                                                  | -           | Cflags        | -
  jr      eq,DSP_LSP_Timer1_noVd                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadb   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD3VOL,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #1,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noVd:
; test volume canal 2
  btst    #6,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | MWrite
  jr      eq,DSP_LSP_Timer1_noVc                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadb   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD2VOL,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #1,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noVc:
; test volume canal 1
  btst    #5,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | MWrite
  jr      eq,DSP_LSP_Timer1_noVb                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadb   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD1VOL,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #1,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noVb:
; test volume canal 0
  btst    #4,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | MWrite
  jr      eq,DSP_LSP_Timer1_noVa                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadb   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD0VOL,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #1,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noVa:

  .if     LSP_avancer_module=1
  store   R0,(R14)                  ; store byte stream ptr                                         | Rr0 & Rr14      | Mr5         | Wr0
  .endif
  addq    #4,R14                  ; avance a word stream ptr                                          | Rr14          | Mr14        | Mwrite
                                                                                  | -           | Cr14        | Mwrite
  load    (R14),R0                  ; R0 = word stream                                            | Rr14          | -         | Wr14

;--------------------------
; gestion des notes
;--------------------------
; test period canal 3
  btst    #3,R2                                                                       | Rr2         | Mr14        | -
                                                                                  | -           | Cflags        | Wr0
  jr      eq,DSP_LSP_Timer1_noPd                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadw   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD3PER,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #2,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noPd:
; test period canal 2
  btst    #2,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | MWrite
  jr      eq,DSP_LSP_Timer1_noPc                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadw   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD2PER,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #2,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noPc:
; test period canal 1
  btst    #1,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | Mwrite
  jr      eq,DSP_LSP_Timer1_noPb                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadw   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD1PER,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #2,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noPb:
; test period canal 0
  btst    #0,R2                                                                       | Rr2         | Mr5         | Wr0
                                                                                  | -           | Cflags        | MWrite
  jr      eq,DSP_LSP_Timer1_noPa                                                                | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  loadw   (R0),R4                                                                       | Rr0         | -         | -
  movei   #LSP_DSP_PAULA_AUD0PER,R5                                                             | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr4
  addq    #2,R0                                                                       | Rr0         | -         | word2word1 > Wr5
  store   R4,(R5)                                                                       | Rr4 & Rr5     | Cr0         | -
DSP_LSP_Timer1_noPa:

; pas de test des 8 bits du haut en entier pour zapper la lecture des instruments
; tst.w d0              ; d0.w, avec d0.b qui a avanc� ! / beq.s  .noInst

  load    (R14+4),R5    ; R5= instrument table  ( =+$10)  = a2   / m_lspInstruments-1 = 5-1                                 | Rr14          | Mr5         | Wr0
                                                                                  | -           | Cr14+4        | Mwrite

;--------------------------
; gestion des instruments
;--------------------------
;--- test instrument voie 3
  movei   #DSP_LSP_Timer1_setIns3,R12                                                             | Rword1        | -   Mr14+4    | -
                                                                                  | Rword2        | word1       | Wr5
  btst    #15,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    ne,(R12)                                                                      | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
 
  movei   #DSP_LSP_Timer1_skip3,R12                                                             | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  btst    #14,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -

; repeat voie 3
  movei   #LSP_DSP_repeat_pointeur3,R3                                                            | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_repeat_length3,R4                                                              | Rword1        | -         | word2word1 > Wr3
                                                                                  | Rword2        | word1       | -
  load    (R3),R3         ; pointeur sauvegard�, sur infos de repeats                                         | Rr3         | -         | word2word1 > Wr4
  load    (R4),R4                                                                       | Rr4         | Mr3         | -
  movei   #LSP_DSP_PAULA_AUD3L,R7                                                               | Rword1        | Mr4         | Wr3
                                                                                  | Rword2        | word1       | Wr4
  movei   #LSP_DSP_PAULA_AUD3LEN,R8                                                             | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R3,(R7)                                                                       | Rr3 & Rr7     | -         | -
  store   R4,(R8)         ; stocke le pointeur sample de repeat dans LSP_DSP_PAULA_AUD3L                                | Rr4 & Rr8     | Mr7         | -
  jump    (R12)       ; jump en DSP_LSP_Timer1_skip3                                                  | Rr12          | Mr8         | MWrite
  nop                                                                               | -           | r12 > WPC     | MWrite

DSP_LSP_Timer1_setIns3:
  loadw   (R0),R3       ; offset de l'instrument par rapport au precedent                                       | Rr0         | -         | -
                                                                                  | -           | Mr0         | -
; addition en .w
  btst    #15,R3                                                                        | Rr3         | -         | Wr3
                                                                                  | -           | Cflags        | -
  jr      eq,.positif3                                                                    | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  movei   #$FFFF0000,R7                                                                   | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  or      R7,R3                                                                       | Rr7 & Rr3     | -         | word2word1 > Wr7
                                                                                  | -           | Cr3         | -
.positif3:
  add     R3,R5       ;R5=pointeur datas instruments                                                  | Rr3 & Rr5     | -         | -
  addq    #2,R0                                                                       | Rr0         | Cr5         | -


  movei   #LSP_DSP_PAULA_AUD3L,R7                                                               | Rword1        | Cr0         | Wr5
                                                                                  | Rword2        | word1       | Wr0
  loadw   (R5),R6                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R6                                                                        | Rr6         | Cr5         | Wr6
  loadw   (R5),R8                                                                       | Rr5         | Cr6         | Wr5
                                                                                  | -           | Mr5         | Wr6
  or      R8,R6                                                                       | Rr8 & Rr6     | -         | Wr8
  movei   #LSP_DSP_PAULA_AUD3LEN,R8                                                             | Rword1        | Cr6         | -
                                                                                  | Rword2        | word1       | Wr6
  shlq    #nb_bits_virgule_offset,R6                                                              | Rr6         | -         | word2word1 > Wr8
                                                                                  | -           | Cr6         | -
  store   R6,(R7)       ; stocke le pointeur sample a virgule dans LSP_DSP_PAULA_AUD3L                                  | Rr6 & Rr7     | -         | Wr6
  addq    #2,R5                                                                       | Rr5         | Mr7         | -
                                                                                  | -           | Cr5         | MWrite
  loadw   (R5),R9       ; .w = R9 = taille du sample                                                  | Rr5         | -         | Wr5
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R9        ; en 16:16                                                  | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  add     R6,R9       ; taille devient fin du sample, a virgule                                           | Rr6 & Rr9     | -         | Wr9
                                                                                  | -           | Cr9         | -
  store   R9,(R8)       ; stocke la nouvelle fin a virgule                                                | Rr9 & Rr8     | -         | Wr9
  addq    #2,R5       ; positionne sur pointeur de repeat                                               | Rr5         | Mr8         | -
; repeat pointeur
  movei   #LSP_DSP_repeat_pointeur3,R7                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  loadw   (R5),R4                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R4                                                                        | Rr4         | Cr5         | Wr4
  loadw   (R5),R8                                                                       | Rr5         | Cr4         | Wr5
                                                                                  | -           | Mr5         | Wr4
  or      R8,R4                                                                       | Rr8 & Rr4     | -         | Wr8
  addq    #2,R5                                                                       | Rr5         | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | Cr5         | Wr4
                                                                                  | -           | Cr4         | Wr5
  store   R4,(R7)       ; pointeur sample repeat, a virgule                                               | Rr4 & Rr7     | -         | Wr4
; repeat length
  movei   #LSP_DSP_repeat_length3,R7                                                              | Rword1        | Mr7         | -
                                                                                  | Rword2        | word1       | MWrite
  loadw   (R5),R8       ; .w = R8 = taille du sample                                                  | Rr5         | -         | word2word1 > Wr7
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R8        ; en 16:16                                                  | Rr8         | -         | Wr8
                                                                                  | -           | Cr8         | -
  add     R4,R8                                                                       | Rr4 & Rr8     | -         | Wr8
                                                                                  | -           | Cr8         | -
  store   R8,(R7)       ; stocke la nouvelle taille                                                   | Rr8 & Rr7     | -         | Wr8
  subq    #4,R5                                                                       | Rr5         | Mr7         | -
 
; test le reset pour prise en compte immediate du changement de sample
  movei   #DSP_LSP_Timer1_noreset3,R12                                                            | Rword1        | Cr5         | MWrite
                                                                                  | Rword2        | word1       | Wr5
  btst    #14,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
; reset a travers le dmacon, il faut rafraichir : LSP_DSP_PAULA_internal_location3 & LSP_DSP_PAULA_internal_length3 & LSP_DSP_PAULA_internal_offset3=0
  movei   #LSP_DSP_PAULA_internal_location3,R7                                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_PAULA_internal_length3,R8                                                          | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R6,(R7)       ; stocke le pointeur sample dans LSP_DSP_PAULA_internal_location3                               | Rr6 & Rr7     | -         | -
  store   R9,(R8)       ; stocke la nouvelle taille en 16:16: dans LSP_DSP_PAULA_internal_length3                           | Rr9 & Rr8     | Mr7         | -
; remplace les 4 octets en stock
  move    R6,R12                                                                        | Rr6         | Mr8         | MWrite
  shrq    #nb_bits_virgule_offset+2,R12 ; enleve la virgule  + 2 bits du bas                                        | Rr12          | -         | Wr12  MWrite
  movei   #LSP_DSP_PAULA_AUD3DAT,R8                                                             | Rword1        | Cr12        | -
                                                                                  | Rword2        | word1       | Wr12
  shlq    #2,R12                                                                        | Rr12          | -         | word2word1 > Wr8
                                                                                  | -           | Cr12        | -
  load    (R12),R7                                                                      | Rr12          | -         | Wr12
                                                                                  | -           | Mr12        | -
  store   R7,(R8)                                                                       | Rr7 & Rr8     | -         | Wr7
 

DSP_LSP_Timer1_noreset3:
DSP_LSP_Timer1_skip3:

;--- test instrument voie 2
  movei   #DSP_LSP_Timer1_setIns2,R12                                                             | Rword1        | Mr8         | -
                                                                                  | Rword2        | word1       | Mwrite
  btst    #13,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    ne,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
 
  movei   #DSP_LSP_Timer1_skip2,R12                                                             | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  btst    #12,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -

; repeat voie 2
  movei   #LSP_DSP_repeat_pointeur2,R3                                                            | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_repeat_length2,R4                                                              | Rword1        | -         | word2word1 > Wr3
                                                                                  | Rword2        | word1       | -
  load    (R3),R3         ; pointeur sauvegard�, sur infos de repeats                                         | Rr3         | -         | word2word1 > Wr4
  load    (R4),R4                                                                       | Rr4         | Mr3         | -
  movei   #LSP_DSP_PAULA_AUD2L,R7                                                               | Rword1        | Mr4         | Wr3
                                                                                  | Rword2        | word1       | Wr4
  movei   #LSP_DSP_PAULA_AUD2LEN,R8                                                             | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R3,(R7)                                                                       | Rr3 & Rr7     | -         | -
  store   R4,(R8)         ; stocke le pointeur sample de repeat dans LSP_DSP_PAULA_AUD3L                                | Rr4 & Rr8     | Mr7         | -
  jump    (R12)       ; jump en DSP_LSP_Timer1_skip3                                                  | Rr12          | Mr8         | Mwrite
  nop                                                                               | -           | WPC         | Mwrite

DSP_LSP_Timer1_setIns2:
  loadw   (R0),R3       ; offset de l'instrument par rapport au precedent                                       | Rr0         | -         | -
                                                                                  | -           | Mr0         | -
; addition en .w
  btst    #15,R3                                                                        | Rr3         | -         | Wr3
                                                                                  | -           | Cflags        | -
  jr      eq,.positif2                                                                    | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  movei   #$FFFF0000,R7                                                                   | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  or      R7,R3                                                                       | Rr7 & Rr3     | -         | word2word1 > Wr7
                                                                                  | -           | Cr3         | -
.positif2:
  add     R3,R5       ;R5=pointeur datas instruments                                                  | Rr3 & Rr5     | -         | Wr3
  addq    #2,R0                                                                       | Rr0         | Cr5         | -


  movei   #LSP_DSP_PAULA_AUD2L,R7                                                               | Rword1        | Cr0         | Wr5
                                                                                  | Rword2        | word1       | Wr0
  loadw   (R5),R6                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R6                                                                        | Rr6         | Cr5         | Wr6
  loadw   (R5),R8                                                                       | Rr5         | Cr6         | Wr5
                                                                                  | -           | Mr5         | Wr6
  or      R8,R6                                                                       | Rr8 & Rr6     | -         | Wr8
  movei   #LSP_DSP_PAULA_AUD2LEN,R8                                                             | Rword1        | Cr6         | -
                                                                                  | Rword2        | word1       | Wr6
  shlq    #nb_bits_virgule_offset,R6                                                              | Rr6         | -         | word2word1 > Wr8
                                                                                  | -           | Cr6         | -
  store   R6,(R7)       ; stocke le pointeur sample a virgule dans LSP_DSP_PAULA_AUD3L                                  | Rr6 & Rr7     | -         | Wr6
  addq    #2,R5                                                                       | Rr5         | Mr7         | -
                                                                                  | -           | Cr5         | Mwrite
  loadw   (R5),R9       ; .w = R9 = taille du sample                                                  | Rr5         | -         | Wr5
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R9        ; en 16:16                                                  | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  add     R6,R9       ; taille devient fin du sample, a virgule                                           | Rr6 & Rr9     | -         | Wr9
                                                                                  | -           | Cr9         | -
  store   R9,(R8)       ; stocke la nouvelle fin a virgule                                                | Rr9 & Rr8     | -         | Wr9
  addq    #2,R5       ; positionne sur pointeur de repeat                                               | Rr5         | Mr8         | -
; repeat pointeur
  movei   #LSP_DSP_repeat_pointeur2,R7                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  loadw   (R5),R4                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R4                                                                        | Rr4         | Cr5         | Wr4
  loadw   (R5),R8                                                                       | Rr5         | Cr4         | Wr5
                                                                                  | -           | Mr5         | Wr4
  or      R8,R4                                                                       | Rr8 & Rr4     | -         | Wr8
  addq    #2,R5                                                                       | Rr5         | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | Cr5         | Wr4
                                                                                  | -           | Cr4         | Wr5
  store   R4,(R7)       ; pointeur sample repeat, a virgule                                               | Rr4 & Rr7     | -         | Wr4
; repeat length
  movei   #LSP_DSP_repeat_length2,R7                                                              | Rword1        | Mr7         | -
                                                                                  | Rword2        | word1       | Mwrite
  loadw   (R5),R8       ; .w = R8 = taille du sample                                                  | Rr5         | -         | word2word1 > Wr7
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R8        ; en 16:16                                                  | Rr8         | -         | Wr8
                                                                                  | -           | Cr8         | -
  add     R4,R8                                                                       | Rr4 & Rr8     | -         | Wr8
                                                                                  | -           | Cr8         | -
  store   R8,(R7)       ; stocke la nouvelle taille                                                   | Rr8 & Rr7     | -         | Wr8
  subq    #4,R5                                                                       | Rr5         | Mr7         | -
 
; test le reset pour prise en compte immediate du changement de sample
  movei   #DSP_LSP_Timer1_noreset2,R12                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  btst    #12,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
; reset a travers le dmacon, il faut rafraichir : LSP_DSP_PAULA_internal_location3 & LSP_DSP_PAULA_internal_length3 & LSP_DSP_PAULA_internal_offset3=0
  movei   #LSP_DSP_PAULA_internal_location2,R7                                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_PAULA_internal_length2,R8                                                          | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R6,(R7)       ; stocke le pointeur sample dans LSP_DSP_PAULA_internal_location3                               | Rr6 & Rr7     | -         | -
  store   R9,(R8)       ; stocke la nouvelle taille en 16:16: dans LSP_DSP_PAULA_internal_length3                           | Rr9 & Rr8     | Mr7         | -
; remplace les 4 octets en stock
  move    R6,R12                                                                        | Rr6         | Mr8         | Mwrite
  shrq    #nb_bits_virgule_offset+2,R12 ; enleve la virgule  + 2 bits du bas                                        | Rr12          | -         | Wr12  Mwrite
  movei   #LSP_DSP_PAULA_AUD2DAT,R8                                                             | Rword1        | Cr12        | -
                                                                                  | Rword2        | word1       | Wr12
  shlq    #2,R12                                                                        | Rr12          | -         | word2word1 > Wr8
                                                                                  | -           | Cr12        | -
  load    (R12),R7                                                                      | Rr12          | -         | Wr12
                                                                                  | -           | Mr12        | -
  store   R7,(R8)                                                                       | Rr7 & Rr8     | -         | Wr7
 

DSP_LSP_Timer1_noreset2:
DSP_LSP_Timer1_skip2:
 
;--- test instrument voie 1
  movei   #DSP_LSP_Timer1_setIns1,R12                                                             | Rword1        | Mr8         | -
                                                                                  | Rword2        | word1       | Mwrite
  btst    #11,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    ne,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
 
  movei   #DSP_LSP_Timer1_skip1,R12                                                             | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  btst    #10,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -

; repeat voie 1
  movei   #LSP_DSP_repeat_pointeur1,R3                                                            | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_repeat_length1,R4                                                              | Rword1        | -         | word2word1 > Wr3
                                                                                  | Rword2        | word1       | -
  load    (R3),R3         ; pointeur sauvegard�, sur infos de repeats                                         | Rr3         | -         | word2word1 > Wr4
  load    (R4),R4                                                                       | Rr4         | Mr3         | -
  movei   #LSP_DSP_PAULA_AUD1L,R7                                                               | Rword1        | Mr4         | Wr3
                                                                                  | Rword2        | word1       | Wr4
  movei   #LSP_DSP_PAULA_AUD1LEN,R8                                                             | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R3,(R7)                                                                       | Rr3 & Rr7     | -         | -
  store   R4,(R8)         ; stocke le pointeur sample de repeat dans LSP_DSP_PAULA_AUD3L                                | Rr4 & Rr8     | Mr7         | -
  jump    (R12)       ; jump en DSP_LSP_Timer1_skip3                                                  | Rr12          | Mr8         | Mwrite
  nop                                                                               | -           | WPC         | Mwrite

DSP_LSP_Timer1_setIns1:
  loadw   (R0),R3       ; offset de l'instrument par rapport au precedent                                       | Rr0         | -         | -
                                                                                  | -           | Mr0         | -
; addition en .w
  btst    #15,R3                                                                        | Rr3         | -         | Wr3
                                                                                  | -           | Cflags        | -
  jr      eq,.positif1                                                                    | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  movei   #$FFFF0000,R7                                                                   | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  or      R7,R3                                                                       | Rr7 & Rr3     | -         | word2word1 > Wr7
                                                                                  | -           | Cr3         | -
.positif1:
  add     R3,R5       ;R5=pointeur datas instruments                                                  | Rr3 & Rr5     | -         | Wr3
  addq    #2,R0                                                                       | Rr0         | Cr5         | -


  movei   #LSP_DSP_PAULA_AUD1L,R7                                                               | Rword1        | Cr0         | Wr5
                                                                                  | Rword2        | word1       | Wr0
  loadw   (R5),R6                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R6                                                                        | Rr6         | Cr5         | Wr6
  loadw   (R5),R8                                                                       | Rr5         | Cr6         | Wr5
                                                                                  | -           | Mr5         | Wr6
  or      R8,R6                                                                       | Rr8 & Rr6     | -         | Wr8
  movei   #LSP_DSP_PAULA_AUD1LEN,R8                                                             | Rword1        | Cr6         | -
                                                                                  | Rword2        | word1       | Wr6
  shlq    #nb_bits_virgule_offset,R6                                                              | Rr6         | -         | word2word1 > Wr8
                                                                                  | -           | Cr6         | -
  store   R6,(R7)       ; stocke le pointeur sample a virgule dans LSP_DSP_PAULA_AUD3L                                  | Rr6 & Rr7     | -         | Wr6
  addq    #2,R5                                                                       | Rr5         | Mr7         | -
                                                                                  | -           | Cr5         | Mwrite
  loadw   (R5),R9       ; .w = R9 = taille du sample                                                  | Rr5         | -         | Wr5
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R9        ; en 16:16                                                  | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  add     R6,R9       ; taille devient fin du sample, a virgule                                           | Rr6 & Rr9     | -         | Wr9
                                                                                  | -           | Cr9         | -
  store   R9,(R8)       ; stocke la nouvelle fin a virgule                                                | Rr9 & Rr8     | -         | Wr9
  addq    #2,R5       ; positionne sur pointeur de repeat                                               | Rr5         | Mr8         | -
; repeat pointeur
  movei   #LSP_DSP_repeat_pointeur1,R7                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  loadw   (R5),R4                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R4                                                                        | Rr4         | Cr5         | Wr4
  loadw   (R5),R8                                                                       | Rr5         | Cr4         | Wr5
                                                                                  | -           | Mr5         | Wr4
  or      R8,R4                                                                       | Rr8 & Rr4     | -         | Wr8
  addq    #2,R5                                                                       | Rr5         | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | Cr5         | Wr4
                                                                                  | -           | Cr4         | Wr5
  store   R4,(R7)       ; pointeur sample repeat, a virgule                                               | Rr4 & Rr7     | -         | Wr4
; repeat length
  movei   #LSP_DSP_repeat_length1,R7                                                              | Rword1        | Mr7         | -
                                                                                  | Rword2        | word1       | Mwrite
  loadw   (R5),R8       ; .w = R8 = taille du sample                                                  | Rr5         | -         | word2word1 > Wr7
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R8        ; en 16:16                                                  | Rr8         | -         | Wr8
                                                                                  | -           | Cr8         | -
  add     R4,R8                                                                       | Rr4 & Rr8     | -         | Wr8
                                                                                  | -           | Cr8         | -
  store   R8,(R7)       ; stocke la nouvelle taille                                                   | Rr8 & Rr7     | -         | Wr8
  subq    #4,R5                                                                       | Rr5         | Mr7         | -
 
; test le reset pour prise en compte immediate du changement de sample
  movei   #DSP_LSP_Timer1_noreset1,R12                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  btst    #10,R2                                                                        | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
; reset a travers le dmacon, il faut rafraichir : LSP_DSP_PAULA_internal_location3 & LSP_DSP_PAULA_internal_length3 & LSP_DSP_PAULA_internal_offset3=0
  movei   #LSP_DSP_PAULA_internal_location1,R7                                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_PAULA_internal_length1,R8                                                          | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R6,(R7)       ; stocke le pointeur sample dans LSP_DSP_PAULA_internal_location3                               | Rr6 & Rr7     | -         | -
  store   R9,(R8)       ; stocke la nouvelle taille en 16:16: dans LSP_DSP_PAULA_internal_length3                           | Rr9 & Rr8     | Mr7         | -
; remplace les 4 octets en stock
  move    R6,R12                                                                        | Rr6         | Mr8         | Mwrite
  shrq    #nb_bits_virgule_offset+2,R12 ; enleve la virgule  + 2 bits du bas                                        | Rr12          | -         | Wr12  Mwrite
  movei   #LSP_DSP_PAULA_AUD1DAT,R8                                                             | Rword1        | Cr12        | -
                                                                                  | Rword2        | word1       | Wr12
  shlq    #2,R12                                                                        | Rr12          | -         | word2word1 > Wr8
                                                                                  | -           | Cr12        | -
  load    (R12),R7                                                                      | Rr12          | -         | Wr12
                                                                                  | -           | Mr12        | -
  store   R7,(R8)                                                                       | Rr7 & Rr8     | -         | Wr7
 

DSP_LSP_Timer1_noreset1:
DSP_LSP_Timer1_skip1:
 
;--- test instrument voie 0
  movei   #DSP_LSP_Timer1_setIns0,R12                                                             | Rword1        | Mr8         | -
                                                                                  | Rword2        | word1       | Mwrite
  btst    #9,R2                                                                       | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    ne,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WP        | -
 
  movei   #DSP_LSP_Timer1_skip0,R12                                                             | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  btst    #8,R2                                                                       | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -

; repeat voie 0
  movei   #LSP_DSP_repeat_pointeur0,R3                                                            | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_repeat_length0,R4                                                              | Rword1        | -         | word2word1 > Wr3
                                                                                  | Rword2        | word1       | -
  load    (R3),R3         ; pointeur sauvegard�, sur infos de repeats                                         | Rr3         | -         | word2word1 > Wr4
  load    (R4),R4                                                                       | Rr4         | Mr3         | -
  movei   #LSP_DSP_PAULA_AUD0L,R7                                                               | Rword1        | Mr4         | Wr3
                                                                                  | Rword2        | word1       | Wr4
  movei   #LSP_DSP_PAULA_AUD0LEN,R8                                                             | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R3,(R7)                                                                       | Rr3 & Rr7     | -         | -
  store   R4,(R8)         ; stocke le pointeur sample de repeat dans LSP_DSP_PAULA_AUD3L                                | Rr4 & Rr8     | Mr7         | -
  jump    (R12)       ; jump en DSP_LSP_Timer1_skip3                                                  | Rr12          | Mr8         | Mwrite
  nop                                                                               | -           | WPC         | Mwrite

DSP_LSP_Timer1_setIns0:
  loadw   (R0),R3       ; offset de l'instrument par rapport au precedent                                       | Rr0         | -         | -
                                                                                  | -           | Mr0         | -
; addition en .w
  btst    #15,R3                                                                        | Rr3         | -         | Wr3
                                                                                  | -           | Cflags        | -
  jr      eq,.positif0                                                                    | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  movei   #$FFFF0000,R7                                                                   | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  or      R7,R3                                                                       | Rr7 & Rr3     | -         | word2word1 > Wr7
                                                                                  | -           | Cr3         | -

.positif0:
  add     R3,R5       ;R5=pointeur datas instruments                                                  | Rr3 & Rr5     | -         | Wr3
  addq    #2,R0                                                                       | Rr0         | Cr5         | -


  movei   #LSP_DSP_PAULA_AUD0L,R7                                                               | Rword1        | Cr0         | Wr5
                                                                                  | Rword2        | word1       | Wr0
  loadw   (R5),R6                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R6                                                                        | Rr6         | Cr5         | Wr6
  loadw   (R5),R8                                                                       | Rr5         | Cr6         | Wr5
                                                                                  | -           | Mr5         | Wr6
  or      R8,R6                                                                       | Rr8 & Rr6     | -         | Wr8
  movei   #LSP_DSP_PAULA_AUD0LEN,R8                                                             | Rword1        | Cr6         | -
                                                                                  | Rword2        | word1       | Wr6
  shlq    #nb_bits_virgule_offset,R6                                                              | Rr6         | -         | word2word1 > Wr8
                                                                                  | -           | Cr6         | -
  store   R6,(R7)       ; stocke le pointeur sample a virgule dans LSP_DSP_PAULA_AUD3L                                  | Rr6 & Rr7     | -         | Wr6
  addq    #2,R5                                                                       | Rr5         | Mr7         | -
                                                                                  | -           | Cr5         | Mwrite
  loadw   (R5),R9       ; .w = R9 = taille du sample                                                  | Rr5         | -         | Wr5
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R9        ; en 16:16                                                  | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  add     R6,R9       ; taille devient fin du sample, a virgule                                           | Rr6 & Rr9     | -         | Wr9
                                                                                  | -           | Cr9         | -
  store   R9,(R8)       ; stocke la nouvelle fin a virgule                                                | Rr9 & Rr8     | -         | Wr9
  addq    #2,R5       ; positionne sur pointeur de repeat                                               | Rr5         | Mr8         | -
; repeat pointeur
  movei   #LSP_DSP_repeat_pointeur0,R7                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  loadw   (R5),R4                                                                       | Rr5         | -         | word2word1 > Wr7
  addq    #2,R5                                                                       | Rr5         | Mr5         | -
  shlq    #16,R4                                                                        | Rr4         | Cr5         | Wr4
  loadw   (R5),R8                                                                       | Rr5         | Cr4         | Wr5
                                                                                  | -           | Mr5         | Wr4
  or      R8,R4                                                                       | Rr8 & Rr4     | -         | Wr8
  addq    #2,R5                                                                       | Rr5         | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | Cr5         | Wr4
                                                                                  | -           | Cr4         | Wr5
  store   R4,(R7)       ; pointeur sample repeat, a virgule                                               | Rr4 & Rr7     | -         | Wr4
; repeat length
  movei   #LSP_DSP_repeat_length0,R7                                                              | Rword1        | Mr7         | -
                                                                                  | Rword2        | word1       | Mwrite
  loadw   (R5),R8       ; .w = R8 = taille du sample                                                  | Rr5         | -         | word2word1 > Wr7
                                                                                  | -           | Mr5         | -
  shlq    #nb_bits_virgule_offset,R8        ; en 16:16                                                  | Rr8         | -         | Wr8
                                                                                  | -           | Cr8         | -
  add     R4,R8                                                                       | Rr4 & Rr8     | -         | Wr8
                                                                                  | -           | Cr8         | -
  store   R8,(R7)       ; stocke la nouvelle taille                                                   | Rr8 & Rr7     | -         | Wr8
  subq    #4,R5                                                                       | Rr5         | Mr7         | -
 
; test le reset pour prise en compte immediate du changement de sample
  movei   #DSP_LSP_Timer1_noreset0,R12                                                            | Rword1        | Cr5         | Mwrite
                                                                                  | Rword2        | word1       | Wr5
  btst    #8,R2                                                                       | Rr2         | -         | word2word1 > Wr12
                                                                                  | -           | Cflags        | -
  jump    eq,(R12)                                                                      | Rflags  & Rr12    | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
; reset a travers le dmacon, il faut rafraichir : LSP_DSP_PAULA_internal_location3 & LSP_DSP_PAULA_internal_length3 & LSP_DSP_PAULA_internal_offset3=0
  movei   #LSP_DSP_PAULA_internal_location0,R7                                                        | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_PAULA_internal_length0,R8                                                          | Rword1        | -         | word2word1 > Wr7
                                                                                  | Rword2        | word1       | -
                                                                                  | -           | -         | word2word1 > Wr8
  store   R6,(R7)       ; stocke le pointeur sample dans LSP_DSP_PAULA_internal_location3                               | Rr6 & Rr7     | -         | -
  store   R9,(R8)       ; stocke la nouvelle taille en 16:16: dans LSP_DSP_PAULA_internal_length3                           | Rr9 & Rr8     | Mr7         | -
; remplace les 4 octets en stock
  move    R6,R12                                                                        | Rr6         | Mr8         | Mwrite
  shrq    #nb_bits_virgule_offset+2,R12 ; enleve la virgule  + 2 bits du bas                                        | Rr12          | -         | Wr12  Mwrite
  movei   #LSP_DSP_PAULA_AUD0DAT,R8                                                             | Rword1        | Cr12        | -
                                                                                  | Rword2        | word1       | Wr12
  shlq    #2,R12                                                                        | Rr12          | -         | word2word1 > Wr8
                                                                                  | -           | Cr12        | -
  load    (R12),R7                                                                      | Rr12          | -         | Wr12
                                                                                  | -           | Mr12        | -
  store   R7,(R8)                                                                       | Rr7 & Rr8     | -         | Wr7
 

DSP_LSP_Timer1_noreset0:
DSP_LSP_Timer1_skip0:
 
 

DSP_LSP_Timer1_noInst:
  .if     LSP_avancer_module=1
  store   R0,(R14)      ; store word stream (or byte stream if coming from early out)                                 | Rr0 & Rr14      | Mr8         | -
  .endif


; - fin de la conversion du player LSP

; elements d'emulation Paula
; calcul des increments
; calcul de l'increment a partir de la note Amiga : (3546895 / note) / frequence I2S

; conversion period => increment voie 0
  movei   #DSP_frequence_de_replay_reelle_I2S,R0                                                        | Rword1        | Mr14        | Mwrite
                                                                                  | Rword2        | word1       | Mwrite
  movei   #LSP_DSP_PAULA_internal_increment0,R1                                                       | Rword1        | -         | word2word1 > Wr0
                                                                                  | Rword2        | word1       | -
  movei   #LSP_DSP_PAULA_AUD0PER,R2                                                             | Rword1        | -         | word2word1 > Wr1
                                                                                  | Rword2        | word1       | -
  load    (R0),R0                                                                       | Rr0         | -         | word2word1 > Wr2
  movei   #3546895,R3                                                                     | Rword1        | Mr0         | -
                                                                                  | Rword2        | word1       | Wr0
  load    (R2),R2                                                                       | Rr2         | -         | word2word1 > Wr3
                                                                                  | -           | Mr2         | -
  cmpq    #0,R2                                                                       | Rr2         | -         | Wr2
                                                                                  | -           | Cflags        | -
  jr      ne,.1                                                                       | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  moveq   #0,R4                                                                       | #0          | -         | -
  jr      .2                                                                          | -           | -         | Wr4
  nop                                                                               | -           | WPC         | -
.1:
  move    R3,R4                                                                       | Rr3         | -         | -
  div     R2,R4     ; (3546895 / note)                                                          | Rr2 & Rr4     | -         | Wr4
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  div     R0,R4     ; (3546895 / note) / frequence I2S en 16:16                                             | Rr0 & Rr4     | -         | -
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
.2:
  store   R4,(R1)                                                                       | Rr4 & Rr1     | -         | Wr4
; conversion period => increment voie 1
  movei   #LSP_DSP_PAULA_AUD1PER,R2                                                             | Rword1        | Mr1         | -
                                                                                  | Rword2        | word1       | MWrite
  movei   #LSP_DSP_PAULA_internal_increment1,R1                                                       | Rword1        | -         | word2word1 > Wr2
                                                                                  | Rword2        | word1       | -
  move    R3,R4                                                                       | Rr3         | -         | word2word1 > Wr1
  load    (R2),R2                                                                       | Rr2         | -         | Wr4
                                                                                  | -           | Mr2         | -
  cmpq    #0,R2                                                                       | Rr2         | -         | Wr2
                                                                                  | -           | Cflags        | -
  jr      ne,.12                                                                        | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  moveq   #0,R4                                                                       | #0          | -         | -
  jr      .22                                                                         | -           | -         | Wr4
  nop                                                                               | -           | WPC         | -
.12:

  div     R2,R4     ; (3546895 / note)                                                          | Rr2 & Rr4     | -         | -
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  div     R0,R4     ; (3546895 / note) / frequence I2S en 16:16                                             | Rr0 & Rr4     | -         | Wr4
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
.22:
  store   R4,(R1)                                                                       | Rr4 & Rr1     | -         | Wr4

; conversion period => increment voie 2
  movei   #LSP_DSP_PAULA_AUD2PER,R2                                                             | Rword1        | Mr1         | -
                                                                                  | Rword2        | word1       | MWrite
  movei   #LSP_DSP_PAULA_internal_increment2,R1                                                       | Rword1        | -         | word2word1 > Wr2
                                                                                  | Rword2        | word1       | -
  move    R3,R4                                                                       | Rr3         | -         | word2word1 > Wr1
  load    (R2),R2                                                                       | Rr2         | -         | Wr4
                                                                                  | -           | Mr2         | -
  cmpq    #0,R2                                                                       | Rr2         | -         | Wr2
                                                                                  | -           | Cflags        | -
  jr      ne,.13                                                                        | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  moveq   #0,R4                                                                       | #0          | -         | -
  jr      .23                                                                         | -           | -         | Wr4
  nop                                                                               | -           | WPC         | -
.13:
  div     R2,R4     ; (3546895 / note)                                                          | Rr2 & Rr4     | -         | -
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  div     R0,R4     ; (3546895 / note) / frequence I2S en 16:16                                             | Rr0 & Rr4     | -         | Wr4
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
.23:
  store   R4,(R1)                                                                       | Rr4 & Rr1     | -         | Wr4

; conversion period => increment voie 3
  movei   #LSP_DSP_PAULA_AUD3PER,R2                                                             | Rword1        | Mr1         | -
                                                                                  | Rword2        | word1       | Mwrite
  movei   #LSP_DSP_PAULA_internal_increment3,R1                                                       | Rword1        | -         | word2word1 > Wr2
                                                                                  | Rword2        | word1       | -
  move    R3,R4                                                                       | Rr3         | -         | word2word1 > Wr1
  load    (R2),R2                                                                       | Rr2         | -         | Wr4
                                                                                  | -           | Mr2         | -
  cmpq    #0,R2                                                                       | Rr2         | -         | Wr2
                                                                                  | -           | Cflags        | -
  jr      ne,.14                                                                        | Rflags        | -         | Wflags
  nop                                                                               | -           | ? > WPC       | -
  moveq   #0,R4                                                                       | #0          | -         | -
  jr      .24                                                                         | -           | -         | Wr4
  nop                                                                               | -           | WPC         | -
.14:
  div     R2,R4     ; (3546895 / note)                                                          | Rr2 & Rr4     | -         | -
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  shlq    #nb_bits_virgule_offset,R4                                                              | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
  div     R0,R4     ; (3546895 / note) / frequence I2S en 16:16                                             | Rr0 & Rr4     | -         | -
                                                                                  | -           | Cr4-1       | -
                                                                                  | -           | Cr4-2       | -
                                                                                  | -           | Cr4-3       | -
                                                                                  | -           | Cr4-4       | -
                                                                                  | -           | Cr4-5       | -
                                                                                  | -           | Cr4-6       | -
                                                                                  | -           | Cr4-7       | -
                                                                                  | -           | Cr4-8       | -
                                                                                  | -           | Cr4-9       | -
                                                                                  | -           | Cr4-10        | -
                                                                                  | -           | Cr4-11        | -
                                                                                  | -           | Cr4-12        | -
                                                                                  | -           | Cr4-13        | -
                                                                                  | -           | Cr4-14        | -
                                                                                  | -           | Cr4-15        | -
  or      R4,R4                                                                       | Rr4         | -         | Wr4
                                                                                  | -           | Cr4         | -
.24:
  store   R4,(R1)                                                                       | Rr4 & Rr1     | -         | -

;--------------------------------------------------

 
;------------------------------------
; return from interrupt Timer 1
  load  (r31),r12 ; return address                                                              | Rr31          | Mr1         | -
  ;bset #10,r13   ; clear latch 1 = I2S
  bset  #11,r13   ; clear latch 1 = timer 1                                                         | Rr13          | Mr31        | MWrite
                                                                                  | -           | Cr13        | -
  ;bset #12,r13   ; clear latch 1 = timer 2
  bclr  #3,r13    ; clear IMASK                                                               | Rr13          | -         | Wr13
  addq  #4,r31    ; pop from stack                                                              | Rr31          | Cr13        | -
  addqt #2,r12    ; next instruction                                                              | Rr12          | Cr31        | Wr13
                                                                                  | -           | Cr12        | -
  jump  t,(r12)   ; return                                                                  | Rr12          | -         | Wr12
  store r13,(r16) ; restore flags                                                               | Rr13  & Rr16      | WPC         | -

;------------------------------------
;rewind
DSP_LSP_Timer1_r_rewind:
; movei   #LSPVars,R14
; load    (R14),R0          ; R0 = byte stream
  load    (R14+8),R0      ; bouclage : R0 = byte stream / m_byteStreamLoop = 8                                      | Rr14          | -         | -
                                                                                  | -           | Cr14+8        | -
  movei   #DSP_LSP_Timer1_process,R12                                                             | Rword1        |     Mr14+8    | -
                                                                                  | Rword2        | word1       | Wr0
  load    (R14+9),R3      ; m_wordStreamLoop=9                                                      | Rr14          | -         | word2word1 > Wr12
                                                                                  | -           | Cr14+9        | -
  jump    (R12)                                                                       | Rr12          |     Mr14+9    | -
  store   R3,(R14+1)        ; m_wordStream=1                                                      | Rr3 & Rr14      | -         | -
                                                                                  | -           | Cr14+1  WPC     | -

;------------------------------------
; change bpm
DSP_LSP_Timer1_r_chgbpm:
  movei   #DSP_LSP_Timer1_process,R12                                                             | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  loadb   (R0),R11                                                                      | Rr0         | -         | word2word1 > Wr12
                                                                                  | -           | Mr0         | -
  store   R11,(R14+7)   ; R3=nouveau bpm / m_currentBpm = 7                                                 | Rr11  & Rr14      | -         | Wr11
                                                                                  | -           | Cr14+7        | -
;application nouveau bpm dans Timer 1
  movei #60*256,R10                                                                       | Rword1        |     Mr14+7    | -
                                                                                  | Rword2        | word1       | Mwrite
  ;shlq #8,R10        ; 16 bits de virgule
  div   R11,R10       ; 60/bpm                                                              | Rr11  & Rr10      | -         | Wr10
  movei #24*65536,R9        ; 24=> 5 bits                                                       | Rword1        | Cr10-1        | -
                                                                                  | Rword2        | Cr10-2  word1   | -
                                                                                  | -           | Cr10-3        | word2word1 > Wr9
                                                                                  | -           | Cr10-4        | -
                                                                                  | -           | Cr10-5        | -
                                                                                  | -           | Cr10-6        | -
                                                                                  | -           | Cr10-7        | -
                                                                                  | -           | Cr10-8        | -
                                                                                  | -           | Cr10-9        | -
                                                                                  | -           | Cr10-10       | -
                                                                                  | -           | Cr10-11       | -
                                                                                  | -           | Cr10-12       | -
                                                                                  | -           | Cr10-13       | -
                                                                                  | -           | Cr10-14       | -
                                                                                  | -           | Cr10-15       | -
  or    R10,R10                                                                         | Rr10          | -         | Wr10
                                                                                  | -           | Cr10        | -
  ;shlq #16,R9
  div   R10,R9        ; R9=                                                               | Rr10  & Rr9     | -         | Wr10
                                                                                  | -           | Cr9-1       | -
                                                                                  | -           | Cr9-2       | -
                                                                                  | -           | Cr9-3       | -
                                                                                  | -           | Cr9-4       | -
                                                                                  | -           | Cr9-5       | -
                                                                                  | -           | Cr9-6       | -
                                                                                  | -           | Cr9-7       | -
                                                                                  | -           | Cr9-8       | -
                                                                                  | -           | Cr9-9       | -
                                                                                  | -           | Cr9-10        | -
                                                                                  | -           | Cr9-11        | -
                                                                                  | -           | Cr9-12        | -
                                                                                  | -           | Cr9-13        | -
                                                                                  | -           | Cr9-14        | -
                                                                                  | -           | Cr9-15        | -
  or    R9,R9                                                                         | Rr9         | -         | Wr9
                                                                                  |-            | Cr9         | -
  shrq  #8,R9       ; R9=frequence replay                                                       | Rr9         | -         | Wr9
  ;move R9,R11  
; frequence du timer 1
  movei #182150,R10       ; 26593900 / 146 = 182150                                                   | Rword1        | Cr9         | -
                                                                                  | Rword2        | word1       | Wr9
  div   R9,R10                                                                          | Rr9 & Rr10      | -         | word2word1 > Wr10
                                                                                  | -           | Cr10-1        | -
                                                                                  | -           | Cr10-2        | -
                                                                                  | -           | Cr10-3        | -
                                                                                  | -           | Cr10-4        | -
                                                                                  | -           | Cr10-5        | -
                                                                                  | -           | Cr10-6        | -
                                                                                  | -           | Cr10-7        | -
                                                                                  | -           | Cr10-8        | -
                                                                                  | -           | Cr10-9        | -
                                                                                  | -           | Cr10-10       | -
                                                                                  | -           | Cr10-11       | -
                                                                                  | -           | Cr10-12       | -
                                                                                  | -           | Cr10-13       | -
                                                                                  | -           | Cr10-14       | -
                                                                                  | -           | Cr10-15       | -
  or    R10,R10                                                                         | Rr10          | -         | Wr10
                                                                                  | -           | Cr10        | -
  move  R10,R13                                                                         | Rr10          | -         | Wr10
  subq  #1,R13          ; -1 pour parametrage du timer 1                                                | Rr13          | -         | Wr13
; 26593900 / 50 = 531�878 => 2 � 73 � 3643 => 146*3643
  movei #JPIT1,r10        ; F10000                                                            | Rword1        | Cr13        | -
                                                                                  | Rword2        | word1       | Wr13
  movei #145*65536,r9       ; Timer 1 Pre-scaler                                                    | Rword1        | -         | word2word1 > Wr10
                                                                                  | Rword2        | word1       | -
  ;shlq #16,r12
  or    R13,R9                                                                          | Rr13  & Rr9     | -         | word2word1 > Wr9
                                                                                  | -           | Cr9         | -
  store r9,(r10)        ; JPIT1 & JPIT2                                                         | Rr9 & Rr10      | -         | Wr9
  jump    (R12)                                                                       | Rr12          | Mr10        | -
  addq    #1,R0                                                                       | Rr0         | WPC         | -




; ------------------- N/A ------------------
DSP_LSP_routine_interruption_Timer2:
; ------------------- N/A ------------------



; ------------- main DSP ------------------
DSP_routine_init_DSP:
; assume run from bank 1
  movei #DSP_ISP+(DSP_STACK_SIZE*4),r31     ; init isp                                                    | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -
  moveq #0,r1                                                                         | #0          | -         | -
  moveta  r31,r31                 ; ISP (bank 0)                                                  | Rr31          | -         | Wr1
  nop                                                                               | -           | -         | Wr'31
  movei #DSP_USP+(DSP_STACK_SIZE*4),r31     ; init usp                                                    | Rword1        | -         | -
                                                                                  | Rword2        | word1       | -

; calculs des frequences deplac� dans DSP
; sclk I2S
  movei #LSP_DSP_Audio_frequence,R0                                                               | Rword1        | -         | word2word1 > Wr31
                                                                                  | Rword2        | word1       | -
  movei #frequence_Video_Clock_divisee,R1                                                           | Rword1        | -         | word2word1 > Wr0
                                                                                  | Rword2        | word1       | -
  load  (R1),R1                                                                         | Rr1         | -         | word2word1 > Wr1
                                                                                  | -           | Mr1         | -
  shlq  #8,R1                                                                         | Rr1         | -         | Wr1
                                                                                  | -           | Cr1         | -
  div   R0,R1                                                                         | Rr0 & Rr1     | -         | Wr1
  movei #128,R2                                                                         | Rword1        | Cr1-1       | -
                                                                                  | Rword2        | Cr1-2 word1   | -
                                                                                  | -           | Cr1-3       | word2word1 > Wr2
                                                                                  | -           | Cr1-4       | -
                                                                                  | -           | Cr1-5       | -
                                                                                  | -           | Cr1-6       | -
                                                                                  | -           | Cr1-7       | -
                                                                                  | -           | Cr1-8       | -
                                                                                  | -           | Cr1-9       | -
                                                                                  | -           | Cr1-10        | -
                                                                                  | -           | Cr1-11        | -
                                                                                  | -           | Cr1-12        | -
                                                                                  | -           | Cr1-13        | -
                                                                                  | -           | Cr1-14        | -
                                                                                  | -           | Cr1-15        | -
  add   R2,R1     ; +128 = +0.5                                                             | Rr2 & Rr1     | -         | Wr1
                                                                                  | -           | Cr1         | -
  shrq  #8,R1                                                                         | Rr1         | -         | Wr1
                                                                                  | -           | Cr1         | -
  subq  #1,R1                                                                         | Rr1         | -         | Wr1
  movei #DSP_parametre_de_frequence_I2S,r2                                                            | Rword1        | Cr1         | -
                                                                                  | Rword2        | word1       | Wr1
  store R1,(R2)                                                                         | Rr1 & Rr2     | -         | Wr2
;calcul inverse
  addq  #1,R1                                                                         | Rr1         | Mr2         | -
                                                                                  | -           | Cr1         | MWrite
  add   R1,R1     ; *2                                                                  | Rr1         | -         | Wr1
                                                                                  | -           | Cr1         | -
  add   R1,R1     ; *2                                                                  | Rr1         | -         | Wr1
                                                                                  | -           | Cr1         | -
  shlq  #4,R1     ; *16                                                                 | Rr1         | -         | Wr1
  movei #frequence_Video_Clock,R0                                                               | Rword1        | Cr1         | -
                                                                                  | Rword2        | word1       | Wr1
  load  (R0),R0                                                                         | Rr0         | -         | word2word1 > Wr0
                                                                                  | -           | Mr0         | -
  div   R1,R0                                                                         | Rr1 & Rr0     | -         | Wr0
  movei #DSP_frequence_de_replay_reelle_I2S,R2                                                          | Rword1        | Cr0-1       | -
                                                                                  | Rword2        | Cr0-2   word1 | -
                                                                                  | -           | Cr0-3       | word2word1 > Wr2
                                                                                  | -           | Cr0-4       | -
                                                                                  | -           | Cr0-5       | -
                                                                                  | -           | Cr0-6       | -
                                                                                  | -           | Cr0-7       | -
                                                                                  | -           | Cr0-8       | -
                                                                                  | -           | Cr0-9       | -
                                                                                  | -           | Cr0-10        | -
                                                                                  | -           | Cr0-11        | -
                                                                                  | -           | Cr0-12        | -
                                                                                  | -           | Cr0-13        | -
                                                                                  | -           | Cr0-14        | -
                                                                                  | -           | Cr0-15        | -
  store R0,(R2)                                                                         | Rr0 & Rr2     | -         | Wr0
 

; init I2S
  movei #SCLK,r10                                                                       | Rword1        | Mr2         | -
                                                                                  | Rword2        | word1       | MWrite
  movei #SMODE,r11                                                                        | Rword1        | -         | word2word1 > Wr10
                                                                                  | Rword2        | word1       | -
  movei #DSP_parametre_de_frequence_I2S,r12                                                           | Rword1        | -         | word2word1 > Wr11
                                                                                  | Rword2        | word1       | -
  movei #%001101,r13      ; SMODE bascule sur RISING                                                    | Rword1        | -         | word2word1 > Wr12
                                                                                  | Rword2        | word1       | -
  load  (r12),r12       ; SCLK                                                              | Rr12          | -         | word2word1 > Wr13
                                                                                  | -           | Mr12        | -
  store r12,(r10)                                                                       | Rr12  & Rr10      | -         | Wr12
  store r13,(r11)                                                                       | Rr13  & Rr11      | Mr10        | -


; init Timer 1
; frq = 24/(60/bpm)
  movei #LSP_BPM_frequence_replay,R11                                                             | Rword1        | Mr11        | MWrite
                                                                                  | Rword2        | word1       | MWrite
  load  (R11),R11                                                                       | Rr11          | -         | word2word1 > Wr11
  movei #60*256,R10                                                                       | Rword1        | Mr11        | -
                                                                                  | Rword2        | word1       | Wr11
  ;shlq #8,R10        ; 16 bits de virgule
  div   R11,R10       ; 60/bpm                                                              | Rr11  & Rr10      | -         | word2word1 > Wr10
  movei #24*65536,R9        ; 24=> 5 bits                                                       | Rword1        | Cr10-1        | -
                                                                                  | Rword2        | Cr10-2    word1 | -
                                                                                  | -           | Cr10-3        | word2word1 > Wr9
                                                                                  | -           | Cr10-4        | -
                                                                                  | -           | Cr10-5        | -
                                                                                  | -           | Cr10-6        | -
                                                                                  | -           | Cr10-7        | -
                                                                                  | -           | Cr10-8        | -
                                                                                  | -           | Cr10-9        | -
                                                                                  | -           | Cr10-10       | -
                                                                                  | -           | Cr10-11       | -
                                                                                  | -           | Cr10-12       | -
                                                                                  | -           | Cr10-13       | -
                                                                                  | -           | Cr10-14       | -
                                                                                  | -           | Cr10-15       | -
  or    R10,R10                                                                         | Rr10          | -         | Wr10
                                                                                  | -           | Cr10        | -
  ;shlq #16,R9
  div   R10,R9        ; R9=                                                               | Rr10  & Rr9     | -         | Wr10
                                                                                  | -           | Cr9-1       | -
                                                                                  | -           | Cr9-2       | -
                                                                                  | -           | Cr9-3       | -
                                                                                  | -           | Cr9-4       | -
                                                                                  | -           | Cr9-5       | -
                                                                                  | -           | Cr9-6       | -
                                                                                  | -           | Cr9-7       | -
                                                                                  | -           | Cr9-8       | -
                                                                                  | -           | Cr9-9       | -
                                                                                  | -           | Cr9-10        | -
                                                                                  | -           | Cr9-11        | -
                                                                                  | -           | Cr9-12        | -
                                                                                  | -           | Cr9-13        | -
                                                                                  | -           | Cr9-14        | -
                                                                                  | -           | Cr9-15        | -
  or    R9,R9                                                                         | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  shrq  #8,R9       ; R9=frequence replay                                                       | Rr9         | -         | Wr9
                                                                                  | -           | Cr9         | -
  move  R9,R11                                                                          | Rr9         | -         | Wr9
 

; frequence du timer 1
  movei #182150,R10       ; 26593900 / 146 = 182150                                                   | Rword1        | -         | Wr11
                                                                                  | Rword2        | word1       | -
  div   R11,R10                                                                         | Rr11  & Rr10      | -         | word2word1 > Wr10
                                                                                  | -           | Cr10-1        | -
                                                                                  | -           | Cr10-2        | -
                                                                                  | -           | Cr10-3        | -
                                                                                  | -           | Cr10-4        | -
                                                                                  | -           | Cr10-5        | -
                                                                                  | -           | Cr10-6        | -
                                                                                  | -           | Cr10-7        | -
                                                                                  | -           | Cr10-8        | -
                                                                                  | -           | Cr10-9        | -
                                                                                  | -           | Cr10-10       | -
                                                                                  | -           | Cr10-11       | -
                                                                                  | -           | Cr10-12       | -
                                                                                  | -           | Cr10-13       | -
                                                                                  | -           | Cr10-14       | -
                                                                                  | -           | Cr10-15       | -
  or    R10,R10                                                                         | Rr10          | -         | Wr10
                                                                                  | -           | Cr10        | -
  move  R10,R13                                                                         | Rr10          | -         | Wr10
   
  subq  #1,R13          ; -1 pour parametrage du timer 1                                                | Rr13          | -         | Wr13
 
 

; 26593900 / 50 = 531�878 => 2 � 73 � 3643 => 146*3643
  movei #JPIT1,r10        ; F10000                                                            | Rword1        | Cr13        | -
                                                                                  | Rword2        | word1       | Wr13
  ;movei  #JPIT2,r11        ; F10002
  movei #145*65536,r12        ; Timer 1 Pre-scaler                                                    | Rword1        | -         | word2word1 > Wr10
                                                                                  | Rword2        | word1       | -
  ;shlq #16,r12
  or    R13,R12                                                                         | Rr13  & Rr12      | -         | word2word1 > Wr12
                                                                                  |-            | Cr12        | -
  store r12,(r10)       ; JPIT1 & JPIT2                                                         | Rr12  & Rr10      | -         | Wr12


; init timer 2

; movei #JPIT3,r10        ; F10004
; movei #JPIT4,r11        ; F10006



; enable interrupts
  movei #D_FLAGS,r28                                                                      | Rword1        | Mr10        | -
                                                                                  | Rword2        | word1       | MWrite
 
  movei #D_I2SENA|D_TIM1ENA|REGPAGE,r29     ; I2S+Timer 1                                                 | Rword1        | -         | word2word1 > Wr28
                                                                                  | Rword2        | word1       | -
  ;movei  #D_I2SENA|REGPAGE,r29         ; I2S only
 
 
  ;movei  #D_TIM1ENA|REGPAGE,r29          ; Timer 1 only
  ;movei  #D_TIM2ENA|REGPAGE,r29          ; Timer 2 only

  store r29,(r28)                                                                       | Rr29  & Rr28      | -         | word2word1 > Wr29

DSP_boucle_centrale:
  movei #DSP_boucle_centrale,R20                                                                | Rword1        | Mr28        | -
                                                                                  | Rword2        | word1       | MWrite
  jump  (R20)                                                                         | Rr20          | -         | word2word1 > Wr20
  nop                                                                               | -           | WPC         | -
 
 
  .phrase

DSP_frequence_de_replay_reelle_I2S:         dc.l      0
DSP_UN_sur_frequence_de_replay_reelle_I2S:      dc.l      0
DSP_parametre_de_frequence_I2S:           dc.l      0

; variables Paula
; channel 0
LSP_DSP_PAULA_AUD0L:        dc.l      silence<<nb_bits_virgule_offset     ; Audio channel 0 location
LSP_DSP_PAULA_AUD0LEN:        dc.l      (silence+4)<<nb_bits_virgule_offset     ; en bytes !
LSP_DSP_PAULA_AUD0PER:        dc.l      0       ; period , a transformer en increment
LSP_DSP_PAULA_AUD0VOL:        dc.l      0       ; volume
LSP_DSP_PAULA_AUD0DAT:        dc.l      0       ; long word en cours d'utilisation / stock� / buffering
LSP_DSP_PAULA_internal_location0: dc.l      silence<<nb_bits_virgule_offset       ; internal register : location of the sample currently played
LSP_DSP_PAULA_internal_increment0:  dc.l      0       ; internal register : increment linked to period 16:16
LSP_DSP_PAULA_internal_length0:   dc.l      (silence+4)<<nb_bits_virgule_offset     ; internal register : length of the sample currently played
LSP_DSP_repeat_pointeur0:     dc.l      silence<<nb_bits_virgule_offset
LSP_DSP_repeat_length0:       dc.l      (silence+4)<<nb_bits_virgule_offset
; channel 1
LSP_DSP_PAULA_AUD1L:        dc.l      silence<<nb_bits_virgule_offset     ; Audio channel 0 location
LSP_DSP_PAULA_AUD1LEN:        dc.l      (silence+4)<<nb_bits_virgule_offset     ; en bytes !
LSP_DSP_PAULA_AUD1PER:        dc.l      0       ; period , a transformer en increment
LSP_DSP_PAULA_AUD1VOL:        dc.l      0       ; volume
LSP_DSP_PAULA_AUD1DAT:        dc.l      0       ; long word en cours d'utilisation / stock� / buffering
LSP_DSP_PAULA_internal_location1: dc.l      silence<<nb_bits_virgule_offset       ; internal register : location of the sample currently played
LSP_DSP_PAULA_internal_increment1:  dc.l      0       ; internal register : increment linked to period 16:16
LSP_DSP_PAULA_internal_length1:   dc.l      (silence+4)<<nb_bits_virgule_offset     ; internal register : length of the sample currently played
LSP_DSP_repeat_pointeur1:     dc.l      silence<<nb_bits_virgule_offset
LSP_DSP_repeat_length1:       dc.l      (silence+4)<<nb_bits_virgule_offset
; channel 2
LSP_DSP_PAULA_AUD2L:        dc.l      silence<<nb_bits_virgule_offset     ; Audio channel 0 location
LSP_DSP_PAULA_AUD2LEN:        dc.l      (silence+4)<<nb_bits_virgule_offset     ; en bytes !
LSP_DSP_PAULA_AUD2PER:        dc.l      0       ; period , a transformer en increment
LSP_DSP_PAULA_AUD2VOL:        dc.l      0       ; volume
LSP_DSP_PAULA_AUD2DAT:        dc.l      0       ; long word en cours d'utilisation / stock� / buffering
LSP_DSP_PAULA_internal_location2: dc.l      silence<<nb_bits_virgule_offset       ; internal register : location of the sample currently played
LSP_DSP_PAULA_internal_increment2:  dc.l      0       ; internal register : increment linked to period 16:16
LSP_DSP_PAULA_internal_length2:   dc.l      (silence+4)<<nb_bits_virgule_offset     ; internal register : length of the sample currently played
LSP_DSP_repeat_pointeur2:     dc.l      silence<<nb_bits_virgule_offset
LSP_DSP_repeat_length2:       dc.l      (silence+4)<<nb_bits_virgule_offset
; channel 3
LSP_DSP_PAULA_AUD3L:        dc.l      silence<<nb_bits_virgule_offset     ; Audio channel 0 location
LSP_DSP_PAULA_AUD3LEN:        dc.l      (silence+4)<<nb_bits_virgule_offset     ; en bytes !
LSP_DSP_PAULA_AUD3PER:        dc.l      0       ; period , a transformer en increment
LSP_DSP_PAULA_AUD3VOL:        dc.l      0       ; volume
LSP_DSP_PAULA_AUD3DAT:        dc.l      0       ; long word en cours d'utilisation / stock� / buffering
LSP_DSP_PAULA_internal_location3: dc.l      silence<<nb_bits_virgule_offset       ; internal register : location of the sample currently played
LSP_DSP_PAULA_internal_increment3:  dc.l      0       ; internal register : increment linked to period 16:16
LSP_DSP_PAULA_internal_length3:   dc.l      (silence+4)<<nb_bits_virgule_offset     ; internal register : length of the sample currently played
LSP_DSP_repeat_pointeur3:     dc.l      silence<<nb_bits_virgule_offset
LSP_DSP_repeat_length3:       dc.l      (silence+4)<<nb_bits_virgule_offset


LSPVars:
m_byteStream:   dc.l  0 ;  0 :  byte stream             0
m_wordStream:   dc.l  0 ;  4 :  word stream             1
m_codeTableAddr:  dc.l  0 ;  8 :  code table addr           2
m_escCodeRewind:  dc.l  0 ; 12 :  rewind special escape code      3
m_escCodeSetBpm:  dc.l  0 ; 16 :  set BPM escape code         4
m_lspInstruments: dc.l  0 ; 20 :  LSP instruments table addr      5
m_relocDone:    dc.l  0 ; 24 :  reloc done flag           6
m_currentBpm:   dc.l  0 ; 28 :  current BPM             7
m_byteStreamLoop: dc.l  0 ; 32 :  byte stream loop point        8
m_wordStreamLoop: dc.l  0 ; 36 :  word stream loop point        9



LSP_BPM_frequence_replay:   dc.l      25

EDZTMP1:    dc.l      0

;---------------------
; FIN DE LA RAM DSP
YM_DSP_fin:
;---------------------


SOUND_DRIVER_SIZE     .equ      YM_DSP_fin-DSP_base_memoire
  .print  "--- Sound driver code size (DSP): ", /u SOUND_DRIVER_SIZE, " bytes / 8192 ---"


        .68000
    .dphrase
ob_liste_originale:                    ; This is the label you will use to address this in 68K code
        .objproc                 ; Engage the OP assembler
    .dphrase

        .org    ob_list_courante       ; Tell the OP assembler where the list will execute
;
        branch      VC < 0, .stahp           ; Branch to the STOP object if VC < 0
        branch      VC > 265, .stahp         ; Branch to the STOP object if VC > 241
      ; bitmap data addr, xloc, yloc, dwidth, iwidth, iheight, bpp, pallete idx, flags, firstpix, pitch
        bitmap      ecran1, 16, 26, nb_octets_par_ligne/8, nb_octets_par_ligne/8, 246-26,3
    ;bitmap   ecran1,16,24,40,40,255,3
        jump        .haha
.stahp:
        stop
.haha:
        jump        .stahp
   
    .68000
    .dphrase
fin_ob_liste_originale:


      .data
  .dphrase

stoplist:   dc.l  0,4

silence:    
    dc.b      $0,$0,$0,$0
    dc.b      $0,$0,$0,$0
    dc.b      $0,$0,$0,$0


debut_ram_libre_DSP:    dc.l      YM_DSP_fin
debut_ram_libre:      dc.l      FIN_RAM
  even

fonte:  
  .include  "fonte1plan.s"
  even

couleur_char:       dc.w    25
curseur_x:          dc.w    0
curseur_y:          dc.w    curseur_Y_min
    even
   
chaine_LSP:           dc.b  "LSP player for Jaguar",10,0
chaine_playing_LSP:       dc.b  "Now playing module",10,0
chaine_BPM_init_LSP:      dc.b  " bpm.",0
chaine_Hz_init_LSP:       dc.b  " Hz.",10,0
chaine_replay_frequency:    dc.b  "Replay frequency : ",0
chaine_RAM_DSP:         dc.b  "DSP RAM available while running : ",0
chaine_entete_debug_module:   dc.b  "location incremen offset   length  ",10,0
chaine_entete_debug_module2:  dc.b  "location length   period   volume",10,0
    even

  .phrase
LSP_module_music_data:
  .incbin     "elysium.lsmusic"
  ;.incbin      "LSP/d.lsmusic"
  ;.incbin      "LSP/k.lsmusic"
  ;.incbin      "LSP/testsamples4v.lsmusic"
  .phrase
LSP_module_sound_bank:
  .incbin     "elysium.lsbank"
  ;.incbin      "LSP/d.lsbank"
  ;.incbin      "LSP/k.lsbank"
  ;.incbin      "LSP/testsamples4v.lsbank"
  .phrase

  .bss
  .phrase
DEBUT_BSS:
;EDZ_compteur_reset_offset_entier_voie_A:     ds.l  1

  .phrase
frequence_Video_Clock:          ds.l        1
frequence_Video_Clock_divisee :     ds.l        1



_50ou60hertz:     ds.l  1
ntsc_flag:        ds.w  1
a_hdb:              ds.w   1
a_hde:              ds.w   1
a_vdb:              ds.w   1
a_vde:              ds.w   1
width:              ds.w   1
height:             ds.w   1
taille_liste_OP:    ds.l  1
vbl_counter:      ds.l  1

            .dphrase
ecran1:       ds.b    320*256       ; 8 bitplanes
  .phrase
FIN_RAM: