Professional Documents
Culture Documents
118
; based on
; K21 CPU PROM VER: Scifer2 1.114 for HEEPS-E detector
; based on
; K21 CPU PROM VER: ROPA 0.105 for HEEPS-E detector
; based on
; K21 CPU PROM VER: Cascades 0.99 for HEEPS-E detector
; for Cascades Box 2 Tray 2 - K21_IC1 on 21_34_72 board
; does NOT have code to drive deflectable aperture -- that will go in the K72 CPU
;
;Scifer2 HE soldered in flight version is v1.113
;SERSIO values:
;detector readout angle step steps sweep
; rate bins time time
;HEEPS T1 32K 64 2ms 64 128ms K21 - new prog 1
;HEEPS T2 32K 64 2ms 64 128ms K21 - new prog 1
;HEEPS M 32K 64 2ms 32 64ms K21 - new prog 3
;HEEPS E 16K 32 2ms 64 128ms K21 - prog 0
;BEEPS p 4K 16 4ms 64 256ms K21 - prog 2 modified
;BEEPS O 4K 16 4ms (64) 256ms K20 - prog 2 modified (sweep generated for
BEEPS p is shared by BEEPS O)
;Scifer2 values:
;detector readout angle step steps sweep
; rate bins time time
;HEEPS E 32K* 32 2ms 32 32ms based on K21 - prog 0
;HEEPS T 32K 64 2ms 64 128ms K21 - new prog 1
;HEEPS M 32K 64 2ms 32 64ms K21 - new prog 3
;BEEPS p 32K** 16 2ms 64 64ms K21 - prog 2 modified
;BEEPS O 32K** 16 2ms (64) 64ms K20 - prog 2 modified (sweep generated for
BEEPS p is shared by BEEPS O)
;* oversampled x2
;** oversampled x4
OVERSAMPLE EQU 1
;OVERSAMPLE EQU 0
SAMPLE EQU 2
;* oversampled x2
IF (DO32BINS)
;PAD8 EQU 1
PAD8 EQU 0
ELSE ;IF (DO32BINS)
;PAD8 EQU 1
PAD8 EQU 0
ENDIF ;IF (DO32BINS)
;ORG_ECHO EQU 0
ORG_ECHO EQU 1
TWO6 EQU 0
TWO5 EQU 32
TWO4 EQU 0
; PORT USAGE
; P0 FIFO output
; P1 BNn input
; P2 DAC output - K21
; P3 single bit IO
; IO BITS
TST BIT P3.0
MAJF BIT P3.1
PPS1 BIT P3.2
;INT1 BIT P3.3
; BIT P3.4 ;COUNTER INPUT (NOT USED)
EVENT BIT P3.5
;WR BIT P3.6 ;LOAD FIFO
ACK BIT P3.7
;INTERNAL RAM
;directive added to make MetaLink ASM51.EXE happy:
DSEG ;directly addressable Data memory SEGment definition
FLAG EQU R7
IF (OVERSAMPLE)
SKIP:
DS 1
ENDIF ;IF (OVERSAMPLE)
; ---------------------------------
ORG 13H
; External INT 1 vectors to here, so each external INT 1 will jump via this
; dispatch code to the appropriate PROGn
INTV1:
MOV SP,#VECH ;1us JUMP INDIRECT THRU VEC BY LOADING SP
RETI ;1us AND DOING A RET
; ---------------------------------
IF (DO32BINS)
MOV R0,#BIN0
ELSE
MOV R0,#BIN1
ENDIF ;IF (DO32BINS)
IF (SKIP_TWO)
INC R0
ENDIF ;IF (SKIP_TWO)
;-------------------------------------------------------
OK:
INC @R0 ;1/2us COUNT EVENT
IF (DOHET)
IF (DO32BINS)
MOV R0,#BIN31
CJNE @R0,#255,OK2 ;1us CHECK FOR WRAP
JMP WT
OK2:
INC @R0 ;1/2us COUNT TOTAL COUNTS
ENDIF ;DO32BINS
ELSE ;IF (DOHET)
IF (DO32BINS)
IF (ECHOTWICE)
MOV A,SWP ;1/2 uS
MOV R0,#BIN31
MOV @R0,A
ENDIF ;IF (ECHOTWICE)
ENDIF ;IF (DO32BINS)
ENDIF ;IF (DOHET)
WT:
IF (SYNC1PPS)
JB PPS1,SWEEPSYNC
MOV FLAG,#0
WT_FOO:
ENDIF ;IF (SYNC1PPS)
IF (TWO4)
; mask out high bits
ANL A,#3FH ;1/2us 1.113 -> 1.114
CLR C ;1/2us 64 -> 32 mapping
RRC A ;1/2us shift bin number right 1 bit
ORL A,#40H ;1/2us 1.113 -> 1.114
ELSE ; IF (TWO4)
; do nothing
ENDIF ; IF (TWO4)
;-------------------------------------------------------
ORG 80H
;detector readout angle step steps sweep
; rate bins time time
;HEEPS E 32K 32 1ms 32 32ms based on K21 - prog 0
;PROG0 HE 32 BYTE READOUT (SWP + 31 BINS). 32 STEP SWEEP.
; Cascades: HE == HEEPS-E: X26 & X34 for detection; X4a for bias; X18 for sweep
;RESTART_HE EQU 200 ;194 - -6 == START_HE - INC_HE
;START_HE EQU 194
;INC_HE EQU -6
;LAST_HE EQU 8
;END_HE EQU 2 ;8 + -6 == LAST_HE + INC_HE
PROG0:
MOV A,SWP ;1/2 uS
IF (DO32BINS)
MOV R0,#BIN0
MOV @R0,A ;1uS WRITE SWP TO FIFO BIN0 (ADDR NOT USED)
IF (ORG_ECHO)
MOVX @R0,A ;1uS WRITE SWP TO FIFO BIN0 (ADDR NOT USED)
ENDIF ;ORG_ECHO
IF (ECHOTWICE)
MOV R0,#BIN31
MOV @R0,A ;WRITE SWP TO BIN31 (WILL BE WRITTEN TO FIFO IN LOOP, BELOW)
ENDIF ;ECHOTWICE
ENDIF ;DO32BINS
MOV SP,#IGNORE ;1uS PLACE TO PUT PC IF INTERRUPTED
MOV P2,A ;OUTPUT SWEEP STEP TO DAC
; ADD A,#INC_HE
IF (OVERSAMPLE)
DJNZ SKIP,SKIPIT
ADD A,#INC_HE
MOV SKIP,#SAMPLE
SKIPIT:
ELSE ;IF (OVERSAMPLE)
ADD A,#INC_HE
ENDIF ;IF (OVERSAMPLE)
;
; since this next is an EQUAL compare, and the increment is not required to
; be +1 or -1, the starting value needs to be carefully chosen both for use
; here in restarting the next sweep and initially on RESET
;
CJNE A,#END_HE,FOO0 ;otherwise do restart of sweep when end value seen
MOV A,#START_HE ;RESET VALUE IF OVERFLOW
FOO0:
MOV SWP,A ;UPDATE SWEEP
JB TST,TST0
IF (ORG_ECHO)
MOV R0,#BIN1 ;OUTPUT BINS 1..30/31 TO FIFO
ELSE
IF (DO32BINS)
MOV R0,#BIN0 ;OUTPUT BINS 0..31 TO FIFO
ELSE
MOV R0,#BIN1 ;OUTPUT BINS 1..30 TO FIFO
ENDIF ;DO32BINS
ENDIF ;ORG_ECHO
LP0:
MOV A,@R0 ;GET BIN
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV @R0,A ;CLEAR BIN
INC R0
;IF (DO32BINS)
; CJNE R0,#BIN32,LP0 ;LOOP FOR 31 BINS
;ELSE
; CJNE R0,#BIN31,LP0 ;LOOP FOR 30 BINS
;ENDIF
IF (DO32BINS)
IF (PAD8)
CJNE R0,#BIN40,LP0 ;LOOP FOR 39 BINS; 31ST BIN IS EITHER HET OR OTHER BYTE OF TWO BYTE HET
ELSE ;IF (PAD8)
CJNE R0,#BIN32,LP0 ;LOOP FOR 31 BINS; 31ST BIN IS EITHER HET OR OTHER BYTE OF TWO BYTE HET
ENDIF ;IF (PAD8)
ELSE ;IF (DO32BINS)
IF (PAD8)
CJNE R0,#BIN39,LP0 ;LOOP FOR 38 BINS
ELSE ;IF (PAD8)
CJNE R0,#BIN31,LP0 ;LOOP FOR 30 BINS
ENDIF ;IF (PAD8)
ENDIF ;IF (DO32BINS)
SETB ACK ;MAKE SURE ACK- IS HI
JMP WT
IF (ORG_ECHO)
MOV R0,#BIN1 ;OUTPUT BINS 1..30/31 TO FIFO
ELSE
IF (DO32BINS)
MOV R0,#BIN0 ;OUTPUT BINS 0..31 TO FIFO
ELSE
MOV R0,#BIN1 ;OUTPUT BINS 1..30 TO FIFO
ENDIF ;DO32BINS
ENDIF ;ORG_ECHO
TLP0:
MOV A,@R0 ;GET BIN
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
MOV A,R1
MOV @R0,A ;SET BIN TO RAMP VALUE
ADD A,#7
MOV R1,A ;BUMP RAMP BY 7
INC R0
IF (DO32BINS)
IF (PAD8)
CJNE R0,#BIN40,TLP0 ;LOOP FOR 39 BINS; 31ST BIN IS EITHER HET OR OTHER BYTE OF TWO BYTE HET
ELSE ;IF (PAD8)
CJNE R0,#BIN32,TLP0 ;LOOP FOR 31 BINS; 31ST BIN IS EITHER HET OR OTHER BYTE OF TWO BYTE HET
ENDIF ;IF (PAD8)
ELSE ;IF (DO32BINS)
IF (PAD8)
CJNE R0,#BIN39,TLP0 ;LOOP FOR 38 BINS
ELSE ;IF (PAD8)
CJNE R0,#BIN31,TLP0 ;LOOP FOR 30 BINS
ENDIF ;IF (PAD8)
ENDIF ;IF (DO32BINS)
;------------------------------------------------------------------------
;PARASYNC MACRO
;EOC SET ($/16)
;EOC SET (EOC+1)*16
; ORG EOC
; ENDM
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
ROM_ID:
DB 'K21 CPU PROM VER: Cascades2 1.118 for HEEPS-E; 40.023 '
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
IF (OVERSAMPLE)
SWEEPDATA:
DB 'HEEPS E 32 K* 32 bins 2 mS/Step 32 Steps 64 mS/sweep; '
DB 'Step energy sweep every SECOND set of bins '
;* oversampled x2
ELSE ;IF (OVERSAMPLE)
SWEEPDATA:
DB 'HEEPS E 32 K 32 bins 1 mS/Step 32 Steps 32 mS/sweep; '
DB 'Step energy sweep every set of bins '
ENDIF ;IF (OVERSAMPLE)
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
OPTIONS:
;IF (FAST_OUT)
DB 'Fast_Out; '
;ELSE
; DB 'NO_Fast_Out; '
;ENDIF ;IF (FAST_OUT)
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
IF (SKIP_TWO)
DB 'on RESET skip two words out; '
ELSE ;IF (SKIP_TWO)
IF (SKIP_ONE)
DB 'on RESET skip ONE word out; '
ELSE ;IF (SKIP_ONE)
DB 'on RESET DO NOT Skip ANY words out; '
ENDIF ;IF (SKIP_ONE)
ENDIF ;IF (SKIP_TWO)
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
IF (SYNC1PPS)
DB 'force energy sweep to reset at 1PPS; '
ELSE
DB 'NO_SYNC1PPS; '
ENDIF ;IF (SYNC1PPS)
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
IF (DO32BINS)
IF (PAD8)
DB '40 bins output; '
ELSE ;IF (PAD8)
DB '32 bins output; '
ENDIF ;IF (PAD8)
IF (DOHET)
DB 'pseudo-total counts in bin 31; '
ELSE ;IF (DOHET)
DB 'nothing in bin 31; '
ENDIF ;IF (DOHET)
ELSE ;IF (DO32BINS)
IF (PAD8)
DB '38 bins output; '
ELSE ;IF (PAD8)
DB '30 bins output; '
ENDIF ;IF (PAD8)
ENDIF ;IF (DO32BINS)
; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
;IF (PARANOID)
; DB 'PARANOID; '
;ELSE
DB 'NOT_PARANOID; '
;ENDIF ;IF (PARANOID)
END