; 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: