;############################################################################## ;# ;# 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 EBSIM_FAST = g0 #def CPU_SYNC = g1 #def ERROR_CTR = c8 #def ADD_CTR = c13 #def ADD_ADR = 0xC05 #ifdef cpu0 #def ERROR_ADR = 0xC00 #endif #ifdef cpu1 #def ERROR_ADR = 0xC08 #endif #ifdef cpu2 #def ERROR_ADR = 0xC10 #endif #ifdef cpu3 #def ERROR_ADR = 0xC18 #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 iext EBSIM mov EBSIM, EBSIM_FAST mov 0, CPU_SYNC iext b1111_0101_0000_0000_0010_0000 mov b1111_0101_0000_0000_0010_0000, r0 jmpr cc_busy, 0 sgio r0, SMOFFON mov CMD_EXT_CLR, r0 sgio r0, SMCMD #else nop nop nop nop nop nop nop nop nop #endif end_cl: jmpr cc_uncond, 0 nop ;###################################################################### ;# ;# 0x0100: Interrrupt Tracklet Processing Jump Address ;# ;# send delayed tracklet end marker ;# ;###################################################################### org 0x0100 #ifdef cpu0 nop nop nop nop #endif #ifdef cpu1 nop nop nop nop #endif #ifdef cpu2 nop nop nop nop #endif #ifdef cpu3 mov 1, r0 jmpr cc_busy, 0 sgio r0, EBSIM_FAST nop #endif ;############################################################## ;# ;# check result ;# ;############################################################## mov EBR0, r8 ; load channel specific address offset add r8, c1, r8 ; add +1 due to shifted response mov EBR1, r9 add r9, c1, r9 mov EBR2, r10 add r10, c1, r10 mov EBR3, r11 add r11, c1, r11 mov EBR4, r12 add r12, c1, r12 mov EBR5, r13 add r13, c1, r13 mov 0, r0 ; r0: time bin number in loopTT mov 892, r1 ; r1: correction = |255-32|*4 loopTT: mov 0, r6 ; r6: error counter for current time bin mov 31, r3 add r8, r3, r3 ; source offset address add r0, r3, r3 ; source address lpio r3, r5 lpio r3, r5 ; input data word shl 2, r5, r3 ; r3: expected input (10+2 Bit) sub r3, r1, r3 ; r2: iput - correction (10+2 Bit) jmp cc_geu, TTo0 mov 0, r3 TTo0: shl -2, r3, r3 ; r3: expected value TTc0: add r0, r8, r4 ; r4: event buffer address (CH00) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc1 add r6, c1, r6 TTc1: add r0, r9, r4 ; r4: event buffer address (CH01) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc2 add r6, c1, r6 TTc2: add r0, r10, r4 ; r4: event buffer address (CH02) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc3 add r6, c1, r6 TTc3: add r0, r11, r4 ; r4: event buffer address (CH03) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc4 add r6, c1, r6 TTc4: add r0, r12, r4 ; r4: event buffer address (CH04) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc5 add r6, c1, r6 #ifdef cpu3 TTc5: add r0, r13, r4 ; r4: event buffer address (CH04) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTend add r6, c1, r6 #else nop nop nop nop nop TTc5: nop #endif TTend: add r6, ERROR_CTR, r6 jmpr cc_busy, 0 sgio r6, ERROR_ADR add r0, c1, r0 cmp r0, 31 jmp cc_ltu, loopTT nop ;############################################################## ;# ;# increase counters ;# ;############################################################## #ifdef cpu3 mov 1, r1 add r1, ADD_CTR, r0 jmpr cc_busy, 0 sgio r0, ADD_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 ;############################################################## ;# ;# end current state, goto clear state (CPU3 only) ;# ;############################################################## #ifdef cpu3 mov 0, r0 jmpr cc_busy, 0 sgio r0, EBSIM_FAST #ifdef MCM mov 0, r0 jmpr cc_busy, 0 iext SEBDOU sgio r0, SEBDOU mov 5, r0 jmpr cc_busy, 0 iext SEBDEN sgio r0, SEBDEN #endif jmpr cc_busy, 0 mov CMD_LP, r0 sgio r0, SMCMD #else nop nop nop nop nop #endif ;############################################################## ;# ;# switch off own clock after transfer ;# ;############################################################## 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