Documente Academic
Documente Profesional
Documente Cultură
100
; based on
; ROPA K21 CPU PROM for HEEPS-I ver 0.089
;
;Scifer2 HM soldered in flight version is v1.099
; v1.100 adds NEWSTYLE/OLDSTYLE conditional assembly flags to vary the ACK handling
; v1.100 OPTIONALLY moves CLR ACK to after any shifting w/ only one instruction before SETB ACK
;Scifer2 HM soldered in flight version is v1.099
; v1.099 adds ANDing and ORing to make sure that bit 6 is set and bit 7 is not set when shifting is done
; v1.098 adds bin number right shifting for 16 or 32 bins -- no hardware changes needed for differing numbers of bins
; v1.097 can be assembled with ASM51 or ASEM_51 to get identical .HEX results
; the HEXBIN.EXE from ASEM will FF pad rather than 00 pad, otherwise .BINs are the same
; v1.096 adds stepping energy on every Nth set of bins option (unused)
; v1.096 adds 16/20 and 32/40 padding options
;
; v0.89 is the same as v0.86 (with FAST_OUT on) which is what went to
; Wallops for the ROPA Pre-Integration and gave apparently good data
; v0.87 added the SKIP_ONE and SKIP_TWO which HEI needed, but apparently
; screw up HII (or the implementation foo-ed something) so 0.87 and 0.88
; are sidelined and we revert to 0.86 renumbered to 0.89
;
; based on K21 CPU PROM VER: Cascades 0.81 for HEEPS-I detector
; derived from K21 PROM VER: Sersio 0.74 for HEEPS-M detector
; for ROPA Box 1 Tray 3 K21 CPU
;
; based on Cascades & Sersio sources which were based on
; SIERRA K21 source from Mark Widholm,
; modified to assemble with ASM51.EXE from MetaLink
;
; original Sierra code used 12 HMz processor & crystal
; now running on 24 MHz processor and crystal
;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 1
OLDSTYLE SET 1
NEWSTYLE SET 0
;OLDSTYLE SET 0
;NEWSTYLE SET 1
IF (OLDSTYLE)
NEWSTYLE SET 0
ELSE
IF (NEWSTYLE)
ELSE
OLDSTYLE SET 1 ;IF NEITHER IS SET, SET OLDSTYLE ON
ENDIF ;IF (NEWSTYLE)
ENDIF ;IF (OLDSTYLE)
; IF 64 BINS
TWO6 EQU 64
TWO5 EQU 0
TWO4 EQU 0
;;ELSE IF 32 BINS
;TWO6 EQU 0
;TWO5 EQU 32
;TWO4 EQU 0
;;ELSE IF 16 BINS
;TWO6 EQU 0
;TWO5 EQU 0
;TWO4 EQU 16
;;ENDIF
;PAD EQU 1
PAD EQU 0
; PORT USAGE
; P0 FIFO output
; P1 BNn input
; P2 DAC output - K21 (not used on K20)
; P3 single bit IO
; IO BITS
TST BIT P3.0
; BIT P3.1
; 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
ORG 8H
SWP: DS 1 ;SWEEP STEP NUMBER
VECL: DS 1
VECH: DS 1
DS 8
IGNORE: DS 3
IF (OVERSAMPLE)
SKIP:
DS 1
ENDIF
; ---------------------------------
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
; ---------------------------------
MOV R0,#BIN0
CLR A
IF (OVERSAMPLE)
MOV SKIP,#SAMPLE
ENDIF
IF (TWO6)
CJNE R0,#BIN64,LPRESET2 ;LOOP FOR 64 BINS
ELSE
IF (TWO5)
IF (PAD)
CJNE R0,#BIN40,LPRESET2 ;LOOP FOR 40 BINS
ELSE ;IF (PAD)
CJNE R0,#BIN32,LPRESET2 ;LOOP FOR 32 BINS
ENDIF ;IF (PAD)
ELSE
IF (TWO4)
IF (PAD)
CJNE R0,#BIN20,LPRESET2 ;LOOP FOR 20 BINS
ELSE ;IF (PAD)
CJNE R0,#BIN16,LPRESET2 ;LOOP FOR 16 BINS
ENDIF ;IF (PAD)
ENDIF ;IF (TWO4)
ENDIF ;IF (TWO5)
ENDIF ;IF (TWO6)
;----------------------------------- END -- SET DATA TO TEST RAMP
;-------------------------------------------------------
OK:
INC @R0 ;1/2us COUNT EVENT
WT:
JNB EVENT,WT ;1us WAIT FOR: NEXT EVENT OR INTR
MOV A,P1 ;GET BIN # INTO A
IF (OLDSTYLE)
CLR ACK ;1/2us PULSE ACK- TO ENABLE NEXT EVENT
ENDIF ;IF (OLDSTYLE)
;; The AND and the OR following prevent unused input bits from being seen. While hardware should force these bits to
proper values,
;; damage to the internal pull-ups of the chips can prevent pins that should be high from being high.
;;IF (METANOID)
;;; ANL A,#7FH ;64 BINS ;anding this bit out prior to setting it is unnecessary
;; ORL A,#40H
;;ENDIF ;IF (METANOID)
IF (NEWSTYLE)
; mask out high bits
ANL A,#3FH ;1/2us
ENDIF ;IF (NEWSTYLE)
IF (TWO6)
; do nothing
ELSE ;IF (TWO6)
; mask out high bits
IF (OLDSTYLE)
ANL A,#3FH ;1/2us
ENDIF ;IF (OLDSTYLE)
IF (TWO5)
CLR C ;1/2us 64 -> 32 mapping
RRC A ;1/2us shift bin number right 1 bit
ELSE ; IF (TWO5)
IF (TWO4)
CLR C ;1/2us 64 -> 32 mapping
RRC A ;1/2us shift bin number right 1 bit
CLR C ;1/2us 32 -> 16 mapping
RRC A ;1/2us shift bin number right 1 bit
ELSE ; IF (TWO4)
; do nothing
ENDIF ; IF (TWO4)
ENDIF ; IF (TWO5)
IF (OLDSTYLE)
ORL A,#40H ;1/2us
ENDIF ;IF (OLDSTYLE)
ENDIF ; IF (TWO6)
IF (NEWSTYLE)
ORL A,#40H ;1/2us
ENDIF ;IF (NEWSTYLE)
IF (NEWSTYLE)
CLR ACK ;1/2us PULSE ACK- TO ENABLE NEXT EVENT
ENDIF ;IF (NEWSTYLE)
MOV R0,A
SETB ACK ;1/2us
;-------------------------------------------------------
ORG 80H
;detector readout angle step steps sweep
; rate bins time time
;HEEPS T 32K 64 2ms 64 128ms K21 - new prog 1
;START_HT EQU 195
;INC_HT EQU -3
;LAST_HT EQU 6
;END_HT EQU 3 ;3 = 6 + -3 == LAST_HT + INC_HT
PROG0:
MOV SP,#IGNORE ;PLACE TO PUT PC IF INTERUPTED
MOV A,BIN0 ;1/2us
MOVX @R0,A ;1us WRITE BIN0 TO FIFO (ADDR NOT USED)
MOV BIN0,#0 ;1us CLEAR BIN0
MOV A,SWP
MOV P2,A ;OUTPUT SWEEP STEP TO DAC
; ADD A,#INC_HT
IF (OVERSAMPLE)
DJNZ SKIP,SKIPIT
ADD A,#INC_HT
MOV SKIP,#SAMPLE
SKIPIT:
ELSE
ADD A,#INC_HT
ENDIF
;
; 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_HT,FOO0 ;otherwise do restart of sweep when end value seen
MOV A,#START_HT ;RESET VALUE IF OVERFLOW
FOO0:
MOV SWP,A ;UPDATE SWEEP
JB TST,TST0 ; go do test ramp if TST bit set
;IF (PARANOID)
; JMP RESET ;should never get here, so if we do RESET
;ENDIF ;IF (PARANOID)
ROM_ID:
DB 'K21 CPU PROM VER: Scifer2 1.100 for HEEPS-M; '
SWEEPDATA:
DB 'HEEPS M 32K 64bins 2ms/Step 64Steps 128ms/sweep; '
OPTIONS:
IF (FAST_OUT)
DB 'Fast_Out; '
ELSE
DB 'NO_Fast_Out; '
ENDIF ;IF (FAST_OUT)
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)
IF (SYNC1PPS)
DB 'force energy sweep to reset at 1PPS; '
ELSE
DB 'NO_SYNC1PPS; '
ENDIF ;IF (SYNC1PPS)
IF (OVERSAMPLE)
DB 'Step energy sweep every FOURTH set of bins '
;** oversampled x4
ELSE
DB 'Step energy sweep every set of bins '
ENDIF ;IF (OVERSAMPLE)
IF (TWO6)
DB '64 bins output; '
ELSE
IF (TWO5)
IF (PAD)
DB '40 bins output; '
ELSE ;IF (PAD)
DB '32 bins output; '
ENDIF ;IF (PAD)
ELSE
IF (TWO4)
IF (PAD)
DB '20 bins output; '
ELSE ;IF (PAD)
DB '16 bins output; '
ENDIF ;IF (PAD)
ENDIF ;IF (TWO4)
ENDIF ;IF (TWO5)
ENDIF ;IF (TWO6)
IF (OLDSTYLE)
DB 'OLDSTYLE ack handling; '
ELSE ;IF (OLDSTYLE)
IF (NEWSTYLE)
DB 'NEWSTYLE ack handling; '
ELSE ;IF (NEWSTYLE)
DB 'NOT_OLDSTYLE ack handling; '
ENDIF ;IF (NEWSTYLE)
ENDIF ;IF (OLDSTYLE)
IF (PARANOID)
DB 'PARANOID; '
ELSE
DB 'NOT_PARANOID; '
ENDIF ;IF (PARANOID)
END