;############################################################################## ;# ;# 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 DEL_CTR = c13 #def OFFSET_ADR = 0xC04 #def DEL_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 7, r2 jmpr cc_busy, 0 cmp r2, DEL_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, r7 ; load input data address mov 0x20, r0 add r0, r7 ,r7 mov EBR0, r8 ; load channel specific address offset add r8, c1, r8 ; add +1+EBD due to shifted response add r8, DEL_CTR, r8 mov EBR1, r9 add r9, c1, r9 add r9, DEL_CTR, r9 mov EBR2, r10 add r10, c1, r10 add r10, DEL_CTR, r10 mov EBR3, r11 add r11, c1, r11 add r11, DEL_CTR, r11 mov EBR4, r12 add r12, c1, r12 add r12, DEL_CTR, r12 mov EBR5, r13 add r13, c1, r13 add r13, DEL_CTR, r13 mov 6, r0 cmp r0, DEL_CTR jmp cc_neq, no_XtC nop mov 4, r0 sub r8, r0, r8 sub r9, r0, r9 sub r10, r0, r10 sub r11, r0, r11 sub r12, r0, r12 sub r13, r0, r13 no_XtC: nop mov 0, r0 ; r0: time bin number in loopTT loopTT: mov 0, r6 ; r6: error counter for current time bin add r0, r7, r4 lpio r4, r3 ; r3: expected value lpio r4, r3 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, 26 jmp cc_ltu, loopTT nop ;############################################################## ;# ;# increase counters ;# ;############################################################## #ifdef cpu3 mov 1, r1 add r1, DEL_CTR, r0 jmpr cc_busy, 0 sgio r0, DEL_ADR #else nop nop nop nop #endif jmpr cc_busy, 0 ;############################################################## ;# ;# write next LUT test entries ;# ;############################################################## mov DEL_CTR, r12 ; r12: next EBD entry mov 6, r0 cmp r0, DEL_CTR jmp cc_neq, no_XtD nop mov 0, r12 mov 1, r13 iext FCBY mov FCBY, r0 jmpr cc_busy, 0 sgio r13, r0 no_XtD: nop iext EBD mov EBD, r0 jmpr cc_busy, 0 sgio r12, r0 ;############################################################## ;# ;# coarse CPU synchronization ;# ;############################################################## #ifdef cpu3 mov 1, CPU_SYNC #else nop #endif 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