Sunteți pe pagina 1din 9

; Cascades2 K87 Bagel Logic Prom v1.

094
;
; Cascades K87 Bagel Logic Prom v0.090
; based on Sersio K86 TED logic prom v0.81
; based on X86 logic ver 1.2 by Mark Widholm
; X86 TED LOGIC PROM VER: 1.2 27-AUG-01
; For K87_1 board Cascades Box 1 Tray 1
;
; v1.094 for Cascades2 - added PARASYNC at end for text id stuff
; v1.093 for Cascades2 - SYNC1PPS set true (no code reacts to this, yet)
; v1.092 for Cascades2 - adds PROM labelling at end, makes subversion numbering 3 digit
; v0.091 is starting version for Cascades2 - no changes from Casc1 v0.090
; v0.090 was flight version for Cascades1
;
;;;SERSIO comments below
;;;
;;;> but there is at least one timing loop in the X86 code.
;;;
;;;The X86 code is very processor speed dependent. It has a tricky phase
;;;lock scheme that depends on the processor clock being a fixed
;;;relationship to the TM rate. Faster would be ok but the code would need
;;;to be changed. The code might need to be changed anyway if the TM rates
;;;are different. I haven't looked at that. The algorithm doesn't need to
;;;be changed just a few timer values and wait loop counts.
;;;
;;; DAC-86 to AD-7111A changes have been made. Using a count up from zero
;;; (just like DAC-86) as an index into a table for looking up the AD-7111A
;;; codes. The index into the table is the same as the output was to the DAC-86
;;; for the Sierra TED algorithm. So minimal code changes have been necessary.
;;;
;;; first draft of timing changes have been made ... and work in gross at least
;;; we have approximately 1milliSec/Step now on 0.77 measured 1.000544 mS/step
;;; so commented out two NOPs that had been added (want to remove 1.5 microSec, that
removes 1.0)
;;;
;;;SERSIO comments end
;

;directives added to make MetaLink ASM51.EXE happy:


$MOD51
$TITLE(K86 CPU PROM VER: Cascades2 Bagel/K87 v1.094)
$PAGEWIDTH(132)
$PAGEWIDTH(254)
$NOPAGING
$NODEBUG
$SYMBOLS
$OBJECT ;ASEM will object to this directive, no problem

INCLUDECAL EQU 1

SYNC1PPS EQU 1 ;force energy sweep to reset at 1PPS


;SYNC1PPS EQU 0 ;don't force energy sweep to reset at 1PPS

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)

USING 0 ;Select addresses for Bank 0

; PORT USAGE
; P0 UNUSED
; P1 TEST bits
; P2 SWEEP DAC parallel bits ;DAC-86 counts up, AD-7111A counts down need to adjust
; P3 ctr and majf

; SFR DEFS
;TL1 EQU 08BH ;TIMER1 LO BYTE
;TH1 EQU 08DH ;TIMER1 HI BYTE

; IO BITS
; TGATE, DACK and UPDN used in TED but not in Bagel
;TGATE BIT P0.0 ;TEST OSC GATE
;DACK BIT P0.6 ;SKIN DAC CLOCK
;UPDN BIT P0.7 ;SKIN DAC UP/DOWN SEL

CAL BIT P1.0 ;CAL MODE. JUMPER TO GND TO ACTIVATE


SYN BIT P1.1 ;SYNC DEBUG BIT
SNRG BIT P1.2 ;CAL JPR. STEP ENERGY
EDGE BIT P1.3 ;PEAK HI-COUNT EDGE (SOFTWARE FLAG)
SSKN BIT P1.4 ;CAL JPR. STEP SKIN V
;PK BIT P1.5 ;PEAK DETECT DEBUG BIT

;P2 0..5 SWEEP STEP

PCLR BIT P3.2 ;PRESCALER CLEAR


; P3.3 ;(INT1) MAJF
; P3.4 ;(T0) COUNTER INPUT
; P3.5 ;(MinF) Minor Frame

; on Sierra, TED1 in word 55. On Sersio, TED1 in word 13


;DLY EQU 42 ;TED1 SAMPLE (WD 55) DELAY FROM MAJF (98USEC-14)/2 ;timing dependency
DLY EQU 9 ;TED1 SAMPLE (WD 13) DELAY FROM MAJF [(16.25USEC-7)/2]*2 ;timing
dependency -- needs changes for Cascades2

;REG USAGE
;R0 scratch
;R1 scratch in Calibrate, unused in main loop
;R2 <unused>
;R3 scratch ?? not needed, now unused
;R4 <unused>
;R5 <unused>
;R6 <unused>
;R7 <unused>

DSEG
;INTERNAL RAM
ORG 20H ;get past all four register banks
; MAX and PEAK used in TED not in Bagel
STEP: DS 1 ;sweep step number

CSEG
ORG 0
JMP RESET
; should not execute the following
ORG 3 ;IE0
MOV SP,#3FH
CLR P3.0
JMP IDLE

; should not execute the following


ORG 0BH ;TF0
MOV SP,#3FH
CLR P3.1
JMP IDLE

; should not execute the following


ORG 13H ;IE1
MOV SP,#3FH
CLR P3.2
JMP IDLE

; should not execute the following


ORG 1BH ;TF1
MOV SP,#3FH
CLR P3.3
JMP IDLE

; should not execute the following


ORG 23H ;Serial port interrupt
MOV SP,#3FH
CLR P3.4
JMP IDLE

; should not execute the following


ORG 2BH ;TF2
MOV SP,#3FH
CLR P3.5
JMP IDLE

NOP

RESET:
MOV P3,#0FFH
RESET2:
MOV P1,#0FFH
MOV P0,#0FFH
MOV SP,#3FH
MOV TMOD,#15H ;TIMER0 16-BIT COUNTER, TIMER1 16 BIT TIMER
; both under software control
MOV TCON,#54H ;EDGE TRIG INT1, ENABLE TIMER AND COUNTER
; turn on both TIMERs, set INT0 as level triggered (but we won't use it as an
interrupt)
; MOV A,#0 ;SWEEP STEP = 0 -- move initial value to A then to STEP as we will use
it again in two instructions
CLR A ;intent is MOV A,#0
MOV STEP,A ;SWEEP STEP = 0
MOV DPTR,#TABLE ;PREPARE FOR AD SWEEP LOOK-UP -- DPTR should keep value throughout
rest of program
MOVC A,@A+DPTR ;SWEEP STEP = 0, AD CODE=240
MOV P2,A

MOV IE,#00H ;DISable all interrupts


CLR PCLR
NOP
NOP
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG
CLR EDGE
JB CAL,IDLE ;CHECK FOR CAL MODE
IF (INCLUDECAL > 0)
AJMP DOCAL
ENDIF

;----------------------------------------------
;LOOP FOR EACH 1MS ENERGY STEP.
; CODE FROM IDLE TO WT ISN'T TIME CRITCAL AS LONG AS IT IS << 1/2MS
;
IDLE:
CLR PCLR ;TOGGLE PCLR FOR WATCHDOG
NOP
NOP
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG

MOV A,STEP ;GENERATE TEST GATE BASED ON SWEEP STEP ;AD-7111 change made ;using
index & table lookup

WT:
JNB TF1,WT ;WAIT FOR first 1/2 mSec timer (1MSEC TIMER total)
CLR TR1 ;STOP TIMER
CLR PCLR ;TOGGLE PCLR FOR WATCHDOG
NOP
NOP
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG
MOV TH1,#0FFH ;65300d value needs to be changed ;timing dependency - ?fixed
MOV TL1,#014H ;RELOAD -986USEC/2
CLR TF1 ;CLEAR TIMER INTR ;added 0.75 ->0.76 (Duh!)
SETB TR1 ;restart timer

WT2:
JNB TF1,WT2 ;WAIT FOR second 1/2 mSec timer (1MSEC TIMER total)
CLR PCLR ;TOGGLE PCLR FOR WATCHDOG
NOP
NOP
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG
CLR TR1 ;STOP TIMER
MOV TH1,#0FFH ;65301d ;timing dependency - ?fixed
MOV TL1,#015H ;RELOAD -986USEC/2. -(999-13USEC)

MOV A,STEP ;using index & table lookup no further change needed
; ANL A,#03H ;CHECK MAJF PHASE EVERY 4TH STEP ;using index & table lookup no
further change needed
ANL A,#07H ;CHECK MajF every 4th, but Bagel uses every other step ;BAGEL uses 32
steps not 64 steps
JNZ STRT1
;TIMER IS NOMINAL (Sierra) 4USEC SHORT (?? should be same for Sersio but processor
speed twice as fast)
JB IE1,STRT ;HOLD TIMER UNTIL MAJF EDGE IS DETECTED ;number of JB instructions
doubled as CPU clocked twice as fast
JB IE1,STRT ;JB takes 2 uS at 12 MHz, 1uS at 24 ;timing dependency changed
; JB IE1,STRT ;timing dependency changed
JB IE1,STRT ;timing dependency changed
JB IE1,STRT ;NOMINAL EDGE SHOULD BE HERE (4USEC)
JB IE1,STRT ;JB takes 2 uS at 12 MHz, 1uS at 24 ;timing dependency changed
; JB IE1,STRT ;WORST CASE 4USEC EXTRA DELAY
JMP STRT1 ;timing dependency changed

;TO_IDLE: JMP IDLE

STRT1:
NOP ;number of NOP instructions doubled as CPU clocked twice as fast
NOP ;NOP takes 1 uS at 12 MHz and 1/2 uS at 24 MHz
; NOP ;were two NOPs, added two more as clock speed twice as fast
; NOP

STRT:
SETB TR1 ;RE-START TIMER
SETB SYN ;PULSE DEBUG BIT
CLR SYN
CLR TF1 ;CLEAR TIMER INTR
CLR IE1 ;CLEAR MAJF EDGE DETECT
CLR PCLR ;TOGGLE PCLR FOR WATCHDOG
NOP
NOP
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG

MOV R0,#DLY
WT1:
DJNZ R0,WT1 ;WAIT TED1 SAMPLE DELAY FROM MAJF
MOV A,STEP ;using index & table lookup no further change needed
; MOV R3,A ;SAVE STEP NUMBER OF THIS ACCUM
INC A ;using index & table lookup no further change needed
INC A ;BAGEL uses 32 steps not 64 steps, so Bagel uses every OTHER step in
table
ANL A,#3FH ;MOD 64 ;using index & table lookup no further change needed
MOV STEP,A ;Duh! leave this out and of course the sweep doesn't update
; MOV DPTR,#TABLE ;DONE DURING INITIALIZATION
MOVC A,@A+DPTR ;AD-7111 change done
MOV P2,A ;BUMP TO NEXT ENERGY STEP ;AD-7111 change done

JMP IDLE ;NO - LOOP FOR NEXT STEP

IF (INCLUDECAL > 0)
;-------------------------------------------------
;CAL MODE IS ENTERED BY JUMPERING CAL BIT TO GND AND RESETTING CPU
;IT ALLOWS SINGLE STEPPING THE SKIN OR ENERGY DACS
; BOTH DACS ARE SET TO 0 AFTER RESET
; A LOW PULSE >1US AND <512US WILL SINGLE STEP
; IF THE BIT IS HELD LOW THE DAC WILL STEP CONTINUOUSLY EVERY 512US

DOCAL:
MOV R0,#64

LPZ:
DJNZ R0,LPZ
MOV R1,#64

STALL: DJNZ R0,STALL ;WAIT 512USEC (R0 IS 0) ;timing dependency - ? DONE

CLR PCLR
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG
MOV R0,#64
STALL2: DJNZ R0,STALL2 ;DOUBLED TO ACCOUNT FOR 2x CPU CLOCK

CALP:
CLR PCLR
SETB PCLR ;TOGGLE PCLR FOR WATCHDOG
JNB SNRG,STEPN ;WAIT FOR EITHER STEP BIT TO GO LOW
JNB SSKN,STEPS
JNB CAL,CALP
JMP RESET ;EXIT IF CAL BIT GOES HI

;AD-7111 change - using index & table lookup no further change needed
STEPN:
MOV A,STEP ;STEP ENERGY ;AD-7111 change - using index & table lookup no
further change needed
INC A ;STEP ENERGY
MOVC A,@A+DPTR
MOV P2,A
JMP STALL

STEPS:
DJNZ R1,STALL ;COUNT STEPS
JMP DOCAL ;RESET AFTER 63

ENDIF ; IF (INCLUDECAL > 0) THEN

;
_________________________________________________________________________________________
_____________________________________________________
;Sweep look-up table in code space (ROMmed)
ORG 0200H
TABLE: ;Sersio sweep for TED using AD-7111A coded below |
--------------------Sersio----------------------------
;| AD IN offset AD offset AD deltaV offset AD deltaV/V | AD IN Energy
[eV] deltaE deltaE/E
DB 0241 ;| 0241 .9800000E-01 .098000000 .000000000 | 0241 .8166666E-01
.081666660 .000000000
DB 0186 ;| 0186 .1019055 .003905542 .038325120 | 0186 .8492128E-
01 .003254615 .038325080
DB 0170 ;| 0170 .1057926 .003887035 .036742040 | 0170 .8816048E-
01 .003239200 .036742080
DB 0160 ;| 0160 .1100000 .004207425 .038249320 | 0160 .9166666E-
01 .003506184 .038249280
DB 0154 ;| 0154 .1135482 .003548235 .031248700 | 0154 .9462352E-
01 .002956860 .031248680
DB 0148 ;| 0148 .1181456 .004597411 .038913080 | 0148 .9845470E-
01 .003831178 .038913100
DB 0144 ;| 0144 .1219431 .003797501 .031141570 | 0144 .1016193 .
003164582 .031141550
DB 0141 ;| 0141 .1252541 .003310919 .026433620 | 0141 .1043784 .
002759099 .026433630
DB 0137 ;| 0137 .1303915 .005137444 .039400140 | 0137 .1086596 .
004281208 .039400190
DB 0132 ;| 0132 .1381958 .007804334 .056473000 | 0132 .1151632 .
006503612 .056473010
DB 0128 ;| 0128 .1457729 .007577017 .051978240 | 0128 .1214774 .
006314181 .051978240
DB 0124 ;| 0124 .1547782 .009005293 .058181940 | 0124 .1289818 .
007504404 .058181890
DB 0121 ;| 0121 .1626296 .007851422 .048277940 | 0121 .1355246 .
006542861 .048278020
DB 0118 ;| 0118 .1715667 .008937120 .052091230 | 0118 .1429722 .
007447600 .052091230
DB 0116 ;| 0116 .1782013 .006634563 .037230730 | 0116 .1485010 .
005528793 .037230670
DB 0114 ;| 0114 .1854342 .007232919 .039005320 | 0114 .1545285 .
006027430 .039005310
DB 0111 ;| 0111 .1975248 .012090610 .061210590 | 0111 .1646040 .
010075510 .061210610
DB 0108 ;| 0108 .2112873 .013762520 .065136510 | 0108 .1760727 .
011468770 .065136530
DB 0105 ;| 0105 .2269529 .015665640 .069025920 | 0105 .1891274 .
013054700 .069025930
DB 0102 ;| 0102 .2447849 .017831920 .072847320 | 0102 .2039874 .
014859930 .072847300
DB 0100 ;| 0100 .2580226 .013237710 .051304480 | 0100 .2150188 .
011031430 .051304510
DB 0098 ;| 0098 .2724541 .014431540 .052968680 | 0098 .2270451 .
012026280 .052968690
DB 0096 ;| 0096 .2881872 .015733060 .054593210 | 0096 .2401560 .
013110880 .054593170
DB 0094 ;| 0094 .3053391 .017151950 .056173450 | 0094 .2544492 .
014293280 .056173410
DB 0092 ;| 0092 .3240379 .018698750 .057705450 | 0092 .2700315 .
015582290 .057705450
DB 0089 ;| 0089 .3552949 .031257060 .087974970 | 0089 .2960791 .
026047560 .087975000
DB 0086 ;| 0086 .3908743 .035579320 .091024990 | 0086 .3257285 .
029649440 .091024990
DB 0084 ;| 0084 .4172870 .026412730 .063296300 | 0084 .3477392 .
022010620 .063296360
DB 0082 ;| 0082 .4460817 .028794740 .064550360 | 0082 .3717348 .
023995610 .064550350
DB 0080 ;| 0080 .4774733 .031391590 .065745230 | 0080 .3978944 .
026159640 .065745190
DB 0078 ;| 0078 .5116959 .034222600 .066880740 | 0078 .4264132 .
028518830 .066880730
DB 0076 ;| 0076 .5490049 .037308990 .067957480 | 0076 .4575041 .
031090830 .067957480
DB 0074 ;| 0074 .5896785 .040673610 .068975910 | 0074 .4913988 .
033894690 .068975930
DB 0071 ;| 0071 .6576690 .067990480 .103381000 | 0071 .5480575 .
056658740 .103381000
DB 0069 ;| 0069 .7081425 .050473450 .071275850 | 0069 .5901187 .
042061210 .071275850
DB 0066 ;| 0066 .7925144 .084371920 .106461100 | 0066 .6604286 .
070309940 .106461100
DB 0064 ;| 0064 .8551488 .062634410 .073243870 | 0064 .7126240 .
052195310 .073243830
DB 0063 ;| 0063 .8885534 .033404650 .037594420 | 0063 .7404612 .
027837220 .037594430
DB 0061 ;| 0061 .9598491 .071295680 .074278000 | 0061 .7998742 .
059413080 .074278020
DB 0059 ;| 0059 1.037575 .077725410 .074910680 | 0059 .8646454 .
064771180 .074910680
DB 0057 ;| 0057 1.122310 .084735160 .075500690 | 0057 .9352580 .
070612610 .075500670
DB 0055 ;| 0055 1.214687 .092376830 .076049930 | 0055 1.012239 .
076980710 .076049950
DB 0052 ;| 0052 1.369105 .154418000 .112787600 | 0052 1.140920 .
128681700 .112787600
DB 0050 ;| 0050 1.483738 .114633900 .077260200 | 0050 1.236449 .
095528240 .077260180
DB 0048 ;| 0048 1.608711 .124972100 .077684640 | 0048 1.340592 .
104143400 .077684620
DB 0046 ;| 0046 1.744953 .136242600 .078078100 | 0046 1.454128 .
113535500 .078078110
DB 0044 ;| 0044 1.893483 .148529600 .078442570 | 0044 1.577902 .
123774800 .078442600
DB 0043 ;| 0043 1.972698 .079214930 .040155630 | 0043 1.643915 .
066012380 .040155600
DB 0041 ;| 0041 2.141766 .169068600 .078938850 | 0041 1.784805 .
140890500 .078938860
DB 0038 ;| 0038 2.424383 .282616900 .116572700 | 0038 2.020319 .
235514000 .116572700
DB 0036 ;| 0036 2.634187 .209803800 .079646520 | 0036 2.195156 .
174836400 .079646470
DB 0034 ;| 0034 2.862912 .228724700 .079892340 | 0034 2.385760 .
190604000 .079892360
DB 0032 ;| 0032 3.112264 .249352000 .080119170 | 0032 2.593553 .
207793500 .080119230
DB 0030 ;| 0030 3.384104 .271839900 .080328470 | 0030 2.820086 .
226533200 .080328460
DB 0028 ;| 0028 3.680459 .296355700 .080521400 | 0028 3.067049 .
246963000 .080521370
DB 0026 ;| 0026 4.003541 .323082200 .080699100 | 0026 3.336284 .
269235100 .080699090
DB 0025 ;| 0025 4.175850 .172308400 .041263080 | 0025 3.479875 .
143590500 .041263110
DB 0022 ;| 0022 4.739745 .563894700 .118971500 | 0022 3.949787 .
469912300 .118971500
DB 0020 ;| 0020 5.158358 .418613400 .081152450 | 0020 4.298632 .
348844500 .081152460
DB 0017 ;| 0017 5.858116 .699758100 .119451000 | 0017 4.881763 .
583131800 .119451100
DB 0015 ;| 0015 6.377589 .519473100 .081452890 | 0015 5.314658 .
432894200 .081452890
DB 0014 ;| 0014 6.654639 .277049500 .041632540 | 0014 5.545532 .
230874500 .041632530
DB 0012 ;| 0012 7.245946 .591307200 .081605240 | 0012 6.038288 .
492755900 .081605230
DB 0010 ;| 0010 7.890580 .644633800 .081696630 | 0010 6.575483 .
537194700 .081696620
;| -------------------Sersio---------------------------- | AD IN Energy [eV]
deltaE deltaE/E
;| AD IN offset AD offset AD deltaV offset AD deltaV/V |
--------------------Sersio----------------------------

;------------------------------------------------------------------------
;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 'K87 CPU PROM VER: Cascades2 1.094 for Bagel; '

; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
SWEEPDATA:
DB 'Bagel '

OPTIONS:

; 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 (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)

; PARASYNC
EOC SET ($/16)
EOC SET (EOC+1)*16
ORG EOC
IF (INCLUDECAL)
DB 'INCLUDECAL; '
ELSE
DB 'NOT_INCLUDECAL; '
ENDIF ;IF (INCLUDECAL)

END

S-ar putea să vă placă și