;############################################################################## ;# ;# 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 OFFSET_CTR = c12 #def ADD_CTR = c13 #def OFFSET_ADR = 0xC04 #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 mov CMD_PRETRIGG, r1 mov 1054, r2 jmpr cc_busy, 0 cmp r2, OFFSET_CTR jmp cc_leu, end_lp sgio r0, SMCMD nop nop sgio r1, SMCMD #else #ifdef MCM #ifdef cpu1 mov 0, r0 iext SEBDOU sgio r0, SEBDOU #else nop nop nop #endif #endif nop nop nop nop nop nop nop nop nop 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 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 shl -2, ADD_CTR, r1 ; r1: current FGAn entries mov 3, r2 and r2, ADD_CTR, r2 ; r2: current lower 2 bits of FPNP loopTT: mov 0, r6 ; r6: error counter for current time bin add r0, OFFSET_CTR, r3 cmp r3, 1023 jmp cc_leu, TTval mov 1024, r4 sub r3, r4, r3 TTval: shl 2, r3, r3 ; r3: expected input (10+2 Bit) add r3, r1, r3 add r3, r2, r3 shl -2, r3, r3 cmp r3, 1023 jmp cc_leu, TTc0 mov 1023, 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 cmp r0, 256 jmp cc_ltu, ct_LUT mov 0, r0 mov 31, r1 add r1, OFFSET_CTR, r1 jmpr cc_busy, 0 sgio r1, OFFSET_ADR ct_LUT: jmpr cc_busy, 0 sgio r0, ADD_ADR #else nop nop nop nop nop nop nop nop nop nop nop #endif jmpr cc_busy, 0 ;############################################################## ;# ;# write next LUT test entries ;# ;############################################################## shl -2, ADD_CTR, r12 ; r12: next FGAn entries mov 3, r13 and r13, ADD_CTR, r13 ; r13: next lower 2 bits of FPNP iext FGAn mov FGAn, r0 mov 0, r1 loopLT: add r0, r1, r2 jmpr cc_busy, 0 sgio r12, r2 add r1, c1, r1 cmp r1, 21 jmp cc_ltu, loopLT iext FPNP mov FPNP, r0 jmpr cc_busy, 0 sgio r13, r0 ;############################################################## ;# ;# write next test pattern into event buffer ;# ;############################################################## #ifdef cpu3 mov 0, r0 cmp r0, ADD_CTR jmp cc_neq, endEB iext EBW mov EBW, r0 mov 32, r1 add r0, r1, r0 ; r0: event buffer offset address mov 0, r1 ; r1: channel number in loopEB mov 0, r2 ; r2: time bin number in loopEB loopEB: add r2, OFFSET_CTR, r4 shl 7, r1, r3 add r0, r3, r3 add r2, r3, r3 jmpr cc_busy, 0 ; r3: single event buffer address sgio r4, r3 ; r4: data to write mov 10, r5 waitD: sub r5, c1, r5 jmp cc_gts, waitD add r1, c1, r1 cmp r1, 21 jmp cc_ltu, loopEB mov 0, r1 add r2, c1, r2 cmp r2, 32 jmp cc_ltu, loopEB nop endEB: mov 1, CPU_SYNC #else nop #endif ;############################################################## ;# ;# wait for data writing completion ;# ;############################################################## wsy: mov CPU_SYNC, r0 cmp r0, 1 jmp cc_neq, wsy ;############################################################## ;# ;# 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 mov CMD_CLEAR, r0 jmpr cc_busy, 0 sgio r0, SMCMD #else nop 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