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: