;############################################################################## ;# ;# 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 TA_ERROR_CTR = c8 #def TB_ERROR_CTR = c9 #def OFFSET_CTR = c12 #def OFFSET_ADR = 0xC04 #ifdef cpu0 #def TA_ERROR_ADR = 0xC00 #def TB_ERROR_ADR = 0xC01 #endif #ifdef cpu1 #def TA_ERROR_ADR = 0xC08 #def TB_ERROR_ADR = 0xC09 #endif #ifdef cpu2 #def TA_ERROR_ADR = 0xC10 #def TB_ERROR_ADR = 0xC11 #endif #ifdef cpu3 #def TA_ERROR_ADR = 0xC18 #def TB_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 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 1020, 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 ;# ;############################################################## #ifdef cpu3 nop #else jmp cc_uncond, wsy #endif mov 127, r1 ; r1: FGTA entry mov 511, r2 ; r2: FGTB entry mov 0, r4 ; TA CTR expected entry mov 0, r5 ; TB CTR expected entry mov 29, r3 add r3, OFFSET_CTR, r3 shl 2, r3, r3 ; r3: current upper limit shl -2, r1, r8 shl -2, r2, r9 shl -2, r3, r10 cmp r1, r3 jmp cc_gtu, ctrg ; . < TA sub r10, r8, r4 cmp r2, r3 jmp cc_gtu, ctrg ; TA <= . < TB sub r9, r8, r4 ; TB <= . sub r10, r9, r5 ctrg: mov 0, r0 ; r0: channel loop counter mov 0, r6 ; r6: TA error increment mov 0, r7 ; r7: TB error increment iext FGCAn mov FGCAn, r1 ; r1: TA Counters offset address mov 0x20, r2 add r2, r1, r2 ; r2: TB Counters offset address cclp: add r1, r0, r8 ; r8: current TA counter address add r2, r0, r9 ; r9: current TB counter address jmpr cc_busy, 0 lgio 0, r8 jmpr cc_busy, 0 lpio 0x300, r10 ; r10: current TA counter value jmpr cc_busy, 0 lgio 0, r9 jmpr cc_busy, 0 lpio 0x300, r11 ; r11: current TB counter value cmp r4, r10 ; check TA entry jmp cc_eq, caok add r6, c1, r6 caok: cmp r5, r11 ; check TB entry jmp cc_eq, cbok add r7, c1, r7 cbok: add r0, c1, r0 cmp r0, 21 jmp cc_ltu, cclp ; complete loop nop add r6, TA_ERROR_CTR, r6 ; update error counters add r7, TB_ERROR_CTR, r7 jmpr cc_busy, 0 sgio r6, TA_ERROR_ADR jmpr cc_busy, 0 sgio r7, TB_ERROR_ADR ;############################################################## ;# ;# increase counters ;# ;############################################################## #ifdef cpu3 mov 30, r1 add r1, OFFSET_CTR, r1 jmpr cc_busy, 0 sgio r1, OFFSET_ADR #else nop nop nop nop #endif jmpr cc_busy, 0 ;############################################################## ;# ;# write next test pattern into event buffer ;# ;############################################################## #ifdef cpu3 iext EBW mov EBW, r0 mov 33, 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, 30 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