;############################################################################## ;# ;# Test Program for nonlinearity filter. ;# ;# Input data is taken from event buffer and stored back there in ;# another memory region. ;# ;# Marcus Gutfleisch ;# Ruprecht-Karls-Universität Heidelberg, Kirchhoff-Institut für Physik ;# ;# Heidelberg, 18.03.2005 ;# ;############################################################################## #inc #inc ../../assembler.inc ;###################################################################### ;# ;# defines ;# ;###################################################################### #def CPU_SYNC = g0 #def CC_ERROR_CTR = c8 #def LV_ERROR_CTR = c9 #def OFFSET_CTR = c12 #def LS_CTR = c13 #def OFFSET_ADR = 0xC04 #def AL_ADR = 0xC05 #ifdef cpu0 #def CC_ERROR_ADR = 0xC00 #def LV_ERROR_ADR = 0xC01 #endif #ifdef cpu1 #def CC_ERROR_ADR = 0xC08 #def LV_ERROR_ADR = 0xC09 #endif #ifdef cpu2 #def CC_ERROR_ADR = 0xC10 #def LV_ERROR_ADR = 0xC11 #endif #ifdef cpu3 #def CC_ERROR_ADR = 0xC18 #def LV_ERROR_ADR = 0xC19 #endif ;###################################################################### ;# ;# 0x0000: Infinite Loop at Instruction Memory Reset Address ;# ;###################################################################### org 0x0000 jmpr cc_uncond, 0 nop ;###################################################################### ;# ;# 0x0010: Interrrupt Clear Jump Address ;# ;# CPU0: switch off all NI LVDS cells ;# switch off NI clock ;# switch off preprocessor clock ;# switch on filter clock ;# ;# CPU1: end clear state, arm state machine ;# ;# CPU2: get tracklet end signature (???) ;# ;# CPU3: get data end signature (???) ;# ;###################################################################### org 0x0010 mov 0, r12 mov 4, r13 #ifdef cpu0 mov CMD_EXT_CLR, r0 mov 1024, r2 jmpr cc_busy, 0 cmp r2, OFFSET_CTR jmp cc_leu, end_lp sgio r0, SMCMD #else #ifdef MCM #ifdef cpu1 mov 0, r0 iext SEBDOU sgio r0, SEBDOU #else nop nop nop #endif #endif nop nop nop #endif end_cl: jmpr cc_uncond, 0 nop end_lp: #ifdef MCM mov 5, r0 iext SEBDEN sgio r0, SEBDEN jmpr cc_busy, 0 #endif mov CMD_LP, r0 sgio r0, SMCMD jmpr cc_uncond, 0 nop ;###################################################################### ;# ;# 0x0100: Interrrupt Tracklet Processing Jump Address ;# ;# send delayed tracklet end marker ;# ;###################################################################### org 0x0100 #ifdef cpu0 mov 6, r0 iext EBD mov EBD, r1 jmpr cc_busy, 0 sgio r0, r1 #endif #ifdef cpu1 nop nop nop nop nop #endif #ifdef cpu2 nop nop nop nop nop #endif #ifdef cpu3 mov 1, r0 iext EBSIM mov EBSIM, r1 jmpr cc_busy, 0 sgio r0, r1 #endif ;############################################################## ;# ;# increase counters (1/3) ;# ;############################################################## #ifdef cpu3 mov 1, r1 add r1, LS_CTR, r0 jmpr cc_busy, 0 sgio r0, AL_ADR #else nop nop nop nop #endif jmpr cc_busy, 0 ;############################################################## ;# ;# copy lower indicator words ;# ;############################################################## #ifdef cpu0 mov 0x7B8, r15 #endif #ifdef cpu1 mov 0x7CC, r15 #endif #ifdef cpu2 mov 0x7E0, r15 #endif #ifdef cpu3 mov 0x7F4, r15 #endif lpio EBI0, r0 lpio EBI0, r0 sra+ r0 lpio EBI2, r0 lpio EBI2, r0 sra+ r0 lpio EBI4, r0 lpio EBI4, r0 sra+ r0 lpio EBI6, r0 lpio EBI6, r0 sra+ r0 lpio EBI8, r0 lpio EBI8, r0 sra+ r0 #ifdef cpu3 lpio EBIA, r0 lpio EBIA, r0 sra+ r0 #else nop nop nop #endif ;############################################################## ;# ;# DMEM address to copy event buffer data to ;# beware: byte address = 4 * word address ;# ;############################################################## #ifdef cpu0 mov 0x080, r15 #endif #ifdef cpu1 mov 0x238, r15 #endif #ifdef cpu2 mov 0x3F0, r15 #endif #ifdef cpu3 mov 0x5A8, r15 #endif ;############################################################## ;# ;# channel check bits, absolute channel number ;# ;############################################################## #ifdef cpu0 mov 3, r3 #endif #ifdef cpu1 mov 2, r3 #endif #ifdef cpu2 mov 3, r3 #endif #ifdef cpu3 mov 2, r3 #endif ;############################################################## ;# ;# copy event buffer data of CPU's channel 0 ;# ;############################################################## mov EBR0, r14 mov 66, r5 loop0: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop0 ;############################################################## ;# ;# copy event buffer data of CPU's channel 1 ;# ;############################################################## mov EBR1, r14 mov 66, r5 xor r3, c1, r3 loop1: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop1 ;############################################################## ;# ;# copy event buffer data of CPU's channel 2 ;# ;############################################################## mov EBR2, r14 mov 66, r5 xor r3, c1, r3 loop2: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop2 ;############################################################## ;# ;# copy event buffer data of CPU's channel 3 ;# ;############################################################## mov EBR3, r14 mov 66, r5 xor r3, c1, r3 loop3: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop3 ;############################################################## ;# ;# copy event buffer data of CPU's channel 4 ;# ;############################################################## mov EBR4, r14 mov 66, r5 xor r3, c1, r3 loop4: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop4 ;############################################################## ;# ;# copy event buffer data of CPU's channel 5 (CPU3 only) ;# ;############################################################## #ifdef cpu3 mov EBR5, r14 mov 66, r5 xor r3, c1, r3 loop5: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop5 #else nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop #endif ;############################################################## ;# ;# send all but cpu 3 to infinite loop ;# ;############################################################## #ifdef cpu3 nop #else jmpr cc_uncond, 0 #endif nop ;############################################################## ;# ;# increase counters (2/3) (CPU 3 only) ;# ;############################################################## mov 1, r1 add r1, OFFSET_CTR, r0 jmpr cc_busy, 0 sgio r0, OFFSET_ADR ;############################################################## ;# ;# Prepare Pedestal Follower Testing (CPU 3 only) ;# ;############################################################## mov 0, r0 iext EBSIM mov EBSIM, r1 jmpr cc_busy, 0 sgio r0, r1 mov 0, r0 iext EBD mov EBD, r1 jmpr cc_busy, 0 sgio r0, r1 mov 0, r6 ; r6: channel to channel error counter mov 0, r7 ; r7: limit value error counter iext FILCLK mov FILCLK, r8 ; r8: FILCLK address mov 0, r9 ; r9: :=0 (FILCLK off) mov 1, r10 ; r10: :=1 (FILCLK on) iext 0x40000 mov 0x40000, r11 ; r11: timing loop duration mov 0x010, r12 ; r12: timing loop delay mov 0, r13 ; r13: DBANK loop iext FPA mov FPA, r14 ; r14: FPA iext 0xF000 mov 0xF000, r15 ; r15: DBANK offset address mov 1, r0 iext FPCL mov FPCL, r1 jmpr cc_busy, 0 sgio r0, r1 ; activate pedestal accumulators ;############################################################## ;# ;# Do Pedestal Follower Testing (CPU 3 only) ;# ;# r0: time loop counter ;# r1: value of channel 0 (reference) ;# r2: value of channel i (i>0) ;# r3: channel check loop counter ;# r4: ;# r5: DBANK write address ;# ;############################################################## dbkl: jmpr cc_busy, 0 sgio r10, r8 ; switch FILCLK on mov r11, r0 ;############################################## tmlp0: sub r0, c1, r0 ;# timing loop jmp cc_geu, tmlp0 ;############################################## nop jmpr cc_busy, 0 sgio r9, r8 ; switch FILCLK off mov r12, r0 ;############################################## tmlp1: sub r0, c1, r0 ;# Wait till FILCLK is off jmp cc_geu, tmlp1 ;############################################## nop iext FPA ;############################################## mov FPA, r14 ;# jmpr cc_busy, 0 ;# load FPA of channel 00 as reference lgio+ 0 ;# jmpr cc_busy, 0 ;############################################## lpio 0x300, r1 mov 20, r3 ;############################################## cclp: lgio+ 0 ;# jmpr cc_busy, 0 ;# channel to channel comparison loop lpio 0x300, r2 ;# ;# cmp r2, r1 ;# do the comparison jmp cc_eq, ccok ;# add r6, c1, r6 ;# increase error counter if not ok ;# ccok: sub r3, c1, r3 ;# jmp cc_gtu, cclp ;############################################## add r13, r15, r5 ;############################################## jmpr cc_busy, 0 ;# store to DBANK for debugging sgio r1, r5 ;############################################## add r13, c1, r13 ;############################################## cmp r13, 0x100 ;# loop ends after 256 cycles jmp cc_ltu, dbkl ;############################################## nop ;############################################################## ;# ;# check limit value (CPU 3 only) ;# ;# r1: received limit value (from above) ;# r2: expected limit value ;# ;############################################################## mov 255, r2 shl 13, r2, r2 shl 10, r2, r2 cmp r1, r2 jmp cc_eq, lvok add r7, c1, r7 lvok: nop ;############################################################## ;# ;# cleanup after pedestal filter testing (CPU 3 only) ;# ;############################################################## clup: jmpr cc_busy, 0 sgio r10, r8 ; switch FILCLK on jmpr cc_busy, 0 ; store channel to channel errors sgio r6, CC_ERROR_ADR jmpr cc_busy, 0 ; store limit value error sgio r7, LV_ERROR_ADR ;############################################################## ;# ;# increase counters (3/3) (CPU 3 only) ;# ;############################################################## mov 1024, r1 add r1, OFFSET_CTR, r0 jmpr cc_busy, 0 sgio r0, OFFSET_ADR ;############################################################## ;# ;# end current state, goto clear state (CPU3 only) ;# ;############################################################## mov CMD_CLEAR, r0 jmpr cc_busy, 0 sgio r0, SMCMD ;############################################################## ;# ;# switch off own clock after transfer (all CPUs) ;# ;############################################################## clkoff: mov 0, r0 jmpr cc_busy, 0 #ifdef cpu0 sgio r0, CPU0SS #endif #ifdef cpu1 sgio r0, CPU1SS #endif #ifdef cpu2 sgio r0, CPU2SS #endif #ifdef cpu3 sgio r0, CPU3SS #endif jmp cc_uncond, clkoff nop ;###################################################################### ;# ;# 0x0300: Interrrupt Raw Data Readout Jump Address ;# ;# Nothing to be done here. ;# ;###################################################################### org 0x300 jmp cc_uncond, clkoff nop