( NOAA6.4TH - 12 JULY 2011 ( BASED ON SEXTSNDR.4TH FOR TAPS-6 NG OF 23 MAY 2007 ( RUNS FROM RAM ( STOP MODE WORKING: 8 JULY 2011 ( DATACOUNTER & FADR SAVED TO EEPROM: 21 JULY 2011 COLD EXRAM HEX 1100 DP ! ( LEAVE ROOM FOR SEMAPHORE VARIABLES : IS CONSTANT ; : FIS FCONSTANT ; 1000 IS PRGM-ADRS ( PLACE FOR OPS PROGRAM ADDRESS IN RAM 1002 IS CHECKSUM ( VARN USED FOR 16-BIT CHECKSUM 1004 IS MODE ( SAVE A 1 HERE TO SIGNAL SOUNDER MODE RUNNING ( ===================================================================== DECIMAL 102 IS CVER ( CODE VERSION = 1.00 VARIABLE BUFCASTS ( HOLDS # OF CASTS MOVED TO BUFFER VARIABLE BUFPTR ( POINTS AT LOCN OF NEXT CAST DATA IN BUFFER VARIABLE SCNTR ( USED BY TAPSTR VARIABLE DOWNCOUNTER ( USED IN STARTUP VARIABLE RUNMODE ( T = RUN, F = PAUSE CREATE TACCUM 8 ALLOT ( USED BY MAC CREATE SACCUM 8 ALLOT CREATE CACCUM 8 ALLOT CREATE P 8 ALLOT 2VARIABLE N 2VARIABLE M VARIABLE CNTR ( USED BY MAC & DATA DUMP VARIABLE TSAMP VARIABLE NCHUNKS VARIABLE DELAY-BETWEEN ( HOLDS DELAY TIME BETWEEN PINGS VARIABLE #DP ( USED IN FP CONVERSION ROUTINES 2VARIABLE INTEGERS 2VARIABLE DECIMALS VARIABLE SOURCE ( HOLDS ADDRESS OF BUFFER FOR CF WRITES 2VARIABLE SUM ( 4-BYTE INTENSITY ACCUMULATOR, CAST MODE SUM IS HIGH-BYTE ( ENTRY TO UPPER WORD SUM 2+ IS LOW-BYTE ( ENTRY TO LOWER WORD VARIABLE KILLME ( =T IF KILL COMMANDED VARIABLE DATACNTR ( HOLDS # DATA SETS STORED TO CF-RAM 2VARIABLE FADR ( HOLDS CURRENT SECTOR ADDRESS IN CF-RAM 2VARIABLE TEMP-FADR ( HOLDS FADR DURING DATA DUMPS FVARIABLE VBATSF ( CONVERT ADC READING TO BATTERY VOLTAGE ( ================= CONSTANTS FOR DATA STORAGE ====================== 100 IS NBINS 1400 IS ALEN ( TOTAL LENGTH OF EACH ACCUMLATOR ( , , ( 200, 400, 800 BYTES 6 IS NUMFREQ ( # OF FREQUENCIES ALEN NUMFREQ * 512 / 1+ IS NUMBLOCKS ( # OF DATA BLOCKS / DATA SET ( +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ( RAM ASSIGNMENTS ( ( CONSTRUCTED AS AN ARRAY OF DATA WITH CONSTANTS DEFINED TO POINT ( INTO THE ARRAY AT PARTICULAR ELEMENTS. NOTE: COUNTS ARE IN BYTES. CREATE DATASPACE NUMFREQ ALEN * 64 + ALLOT ( ROOM FOR ACCUMULATORS DATASPACE IS DAYTIME ( NAME OF DATA ARRAY SPACE DAYTIME IS SECOND ( SAVE RTC DATA HERE SECOND IS RTC ( NAME FOR RTC READ ROUTINE SECOND 1+ IS MINUTE ( CLOCK DATA IS BCD MINUTE 1+ IS HOUR HOUR 1+ IS DAY DAY 1+ IS DATE DATE 1+ IS MONTH MONTH 1+ IS YEAR YEAR 1+ IS DMODE ( 0 = NOISE FILE ( 1 = DATA FILE DMODE 2+ IS SERNO ( UNIT SERIAL NUMBER ( FOLLOWING DATA READ FROM EEPROM ON STARTUP: SERNO 2+ IS VERNO ( PLACE FOR S/W VERSION VERNO 2+ IS NUMFREQS ( # OF FREQUENCIES NUMFREQS 2+ IS VBAT ( GETS OVER-WRITTEN BY OPS PROG VBAT 2+ IS NPINGS ( # OF PINGS PER AVERAGE NPINGS 2+ IS NSAMPS ( # OF SAMPLES PER PING NSAMPS 2+ IS PULSE ( PULSE CODE PULSE 2+ IS TIMEINT ( MINUTES BETWEEN SOUNDER PROFILES TIMEINT 2+ IS FREQ1 FREQ1 2+ IS FREQ2 ( UP TO 8 FREQUENCIES FREQ2 2+ IS FREQ3 FREQ3 2+ IS FREQ4 FREQ4 2+ IS FREQ5 FREQ5 2+ IS FREQ6 FREQ6 2+ IS ACC1 ( DATA ACCUMULATORS FOR 6 FREQUENCIES ACC1 ALEN + IS ACC2 ACC2 ALEN + IS ACC3 ACC3 ALEN + IS ACC4 ACC4 ALEN + IS ACC5 ACC5 ALEN + IS ACC6 ACC6 ALEN + IS CEORFLAG ( ----------------- OTHER RAM VARIABLES ------------------------- CREATE BUFF ( 32 BYTE INPUT TEXT BUFFER 32 ALLOT CREATE BUFFER 512 ALLOT ( COMPACT FLASH SECTOR BUFFER CREATE DATA 200 ALLOT ( ROOM FOR 100 ECHO AMPLITUDE SAMPLES DATA IS SAMPLE ( NOM DE PLUME ( END OF RAM ASSIGNMENTS ( +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ( ---------------------- CONSTANTS ----------------------------------- HEX ( COMMANDS: 04 IS FORCE-DUMP ( CTRL-D TO FORCE A DATA DUMP 10 IS PROG ( CTRL-P TO PROGRAM NEW PARMS 14 IS RESET-CLOCK ( CTRL-T TO SET CLOCK 44 IS DUMPDAT ( ASCII 'D' FOR DUMP DATA 45 IS ERASEDAT ( ASCII 'E' FOR ERASE DATA 46 IS SHOWFREQS ( ASCII 'F' TO DISPLAY FREQUENCIES 4B IS KILL ( ASCII "K" TO KILL PROGRAM 50 IS PAUSE ( ASCII "P" TO SET PAUSE MODE 52 IS RUN ( ASCII "R" TO SET RUN MODE 53 IS STAT ( ASCII 'S' FOR STATUS DISPLAY 54 IS CLOCK ( ASCII 'T' FOR TOD DISPLAY 56 IS VOLTS ( ASCII 'V' FOR BATTERY VOLTAGE DISPLAY 58 IS XTRA ( ASCII 'X' TAKES EXTRA DATA SET ( -------------------- CPU REGISTERS --------------------------- ( PORT USE IS AS FOLLOWS: ( ( PP0 IS RUN/STOP - ENABLES TRANSMISSIONS OR NOISE DATAFILES ( PP1 IS SHTDWN - CONTROLS POWER TO CPU CARD PERIPHERALS ( HIGH = OFF ( PP2 IS \RTC - REAL-TIME-CLOCK ( PP3 IS \ADC - MAX1067 ADC ( PP4 IS \DAC - AD5300BRT DAC ( PP5 IS FSELECT - TO SELECT BETWEEN F1 AND F2 IN DDS ( PP6 IS \DDS - FRAMES 16-BIT TRANSFERS TO DDS ( PP7 IS \XGATE - TRANSMIT GATE PULSE ( PT0 IS N/A ( PT1 IS BLANKOUT - BLANKING OUTPUT SIGNAL ( PT2-4 IS MUX - M0-M2 SELECTS ACOUSTIC CHANNELS ( PT5-7 IS GAIN - G0-G2 SELECTS POST-IF GAINS ( PAD0 IS BUSY - DETECTS CF-RAM BUSY ( PAD1 IS BLANKIN - BLANKING INPUT SIGNAL ( PAD2 IS CFDET - DETECTS PRESENCE OF CF-RAM CARD ( PAD3 IS VERROR - DETECTS ERROR FROM +5VSW ( PDLC6 IS POWER - CONTROLS POWER TO TRANSMITTER/RECEIVER CARDS 001E IS INTCR ( INTERRUPT CONTROL REGISTER 0056 IS PORTP ( PORT P DATA REGISTER 0057 IS DDRP ( PORT P DATA DIRECTION REGISTER 006F IS PORTAD ( ON-BOARD ADC DATA REGISTER 00AE IS PORTT ( PORT T DATA REGISTER 00AF IS DDRT ( PORT T DATA DIRECTION REGISTER 00FE IS PDLC ( PORT DLC DATA REGISTER 00FF IS DDRDLC ( PORT DLC DATA DIRECTION REGISTER 00C0 IS BAUD-REG ( SERIAL BAUD RATE REG - 16 BITS 00D0 IS SPOCR1 ( SPI 1 CONTROL REGISTER 00D1 IS SPOCR2 ( SPI 2 CONTROL REGISTER 00D2 IS SPOBR ( SPI BAUD RATE REGISTER 00D3 IS SPOSR ( SPI STATUS REGISTER 00D5 IS SPODR ( SPI DATA REGISTER 00D6 IS PORTS ( PORT S DATA REGISTER 00D7 IS DDRS ( PORT S DATA DIRECTION REGISTER 0080 IS TIOS ( TIMER I/O SELECT REGISTER 0084 IS TCNTR ( TIMER COUNTER REGISTER 0086 IS TSCR ( TIMER SYSTEM CONTROL REGISTER 0088 IS TCTL1 ( TIMER SYSTEM OUTPUT CONTROLS 0089 IS TCTL2 008B IS TCTL4 ( TIMER CONTROL REGISTER 4 008D IS TMSK2 ( TIMER INTERRUPT MASK REGISTER 2 008E IS TFLG1 ( TIMER INTERRUPT FLAG REGISTER 1 008F IS TFLG2 ( TIMER INTERRUPT FLAG REGISTER 2 0090 IS TC0 ( TIMER INPUT COMPARE REGISTER 1 0091 IS TC1 ( TIMER INPUT COMPARE REGISTER 2 0E00 IS MYCALS ( EEPROM REGION FOR OPS PARMS 0E60 IS LASTCOUNT ( PLACE TO SAVE CF-RAM SECTOR POINTER 0 IS FALSE -1 IS TRUE ( -------------------- CF-RAM ADDRESSES -------------------------- AAAA IS MARKER ( START OF FRAME MARKER DDDD IS DMARKER ( START OF DATA MARKER EDED IS EOD ( EOD MARKER 7E00 IS CFBASE ( MEMORY-MAPPED WINDOW TO CF RAM ( ADDRESSES DECODED TO R/W TO CF: $7EA0 - 7EAF 7EA0 IS CFDATA ( BYTE-PORT TO FLASH 7EA1 IS CFERROR ( READ-ONLY 7EA1 IS FEATURES ( WRITE ONLY 7EA2 IS SCTRCNT ( SECTOR COUNT REGISTER 7EA3 IS LBA0 ( LBA0:7 = SECTOR NUMBER 7EA4 IS LBA1 ( LBA8:15 = CYLINDER LOW 7EA5 IS LBA2 ( LBA16:23 = CYLINDER HIGH 7EA6 IS HEAD ( BYTE VALUE FOR HEAD COUNT HEAD IS LBA3 ( ALTERNATE NAME 7EA7 IS STATUS ( READ ONLY 7EA7 IS COMMAND ( WRITE ONLY 7EAE IS DEV-CTRL ( WRITE ONLY 7E90 IS CONFIG ( R/W CONFIG REGISTER 7E96 IS SOCKET ( R/W SOCKET & COPY REGISTER ( ---------------------------- REAL-TIME CLOCK ----------------------------- VARIABLE DATA-INT ( # MINUTES BETWEEN DATA SETS VARIABLE NUM1 VARIABLE NUM2 VARIABLE NUM3 DECIMAL CREATE WRTC ( DATA TO WRITE TO RTC 20 ALLOT CREATE RATE-ARRAY ( MINUTES BETWEEN SAMPLES BY MONTH 60 , 60 , 60 , 30 , 30 , 30 , 30 , 30 , 30 , 60 , 60 , 60 , ( ---------------------------- TVG TABLE ----------------------------------- ( LINEAR TVG FOR 100 SAMPLES FROM 0.5 TO 37.5 M @ 0.375 M INTERVALS HEX CREATE TVG 00F5 , 02BB , 03E6 , 04C6 , 0579 , 060D , 068C , 06FC , 075F , 07B8 , 0809 , 0853 , 0897 , 08D7 , 0912 , 094A , 097E , 09AF , 09DE , 0A0B , 0A35 , 0A5E , 0A84 , 0AA9 , 0ACD , 0AEF , 0B10 , 0B30 , 0B4E , 0B6C , 0B89 , 0BA5 , 0BC0 , 0BDA , 0BF3 , 0C0C , 0C24 , 0C3B , 0C52 , 0C68 , 0C7E , 0C93 , 0CA8 , 0CBC , 0CD0 , 0CE3 , 0CF6 , 0D09 , 0D1B , 0D2D , 0D3E , 0D4F , 0D60 , 0D70 , 0D81 , 0D90 , 0DA0 , 0DAF , 0DBE , 0DCD , 0DDC , 0DEA , 0DF8 , 0E06 , 0E14 , 0E21 , 0E2F , 0E3C , 0E49 , 0E55 , 0E62 , 0E6E , 0E7A , 0E86 , 0E92 , 0E9E , 0EAA , 0EB5 , 0EC0 , 0ECB , 0ED6 , 0EE1 , 0EEC , 0EF6 , 0F01 , 0F0B , 0F15 , 0F20 , 0F2A , 0F33 , 0F3D , 0F47 , 0F50 , 0F5A , 0F63 , 0F6D , 0F76 , 0F7F , 0F88 , 0F91 , ( ------------------ PREFIX TABLE FOR DDS CODES --------------------- HEX CREATE PREFIX 3322 , 3120 , 3726 , 3524 , 0000 , ( ---------------------- FREQUENCY TABLES --------------------------- ( 5/09/05 ( LAYOUT IS TTDD FFFF FFFF LLLL LLLL, WHERE ( TT IS THE MUX/GAIN CODE: %GGGMMMXX ( DD IS A DUMMY BYTE [0] ( FFFF FFFF IS THE CODE FOR 2*XMIT FREQ ( LLLL LLLL IS THE CODE FOR THE LO FREQ HEX CREATE FREQS E000 , 0083 , 126F , 006F , 6944 , ( 50 KHZ FREQS + 0 E400 , 00CC , 78EA , 0094 , 1C82 , ( 78 KHZ FREQS + 10 E000 , 012D , 7732 , 00C4 , 9BA6 , ( 115 KHZ FREQS + 20 E400 , 020C , 49BA , 0134 , 04EA , ( 200 KHZ FREQS + 30 E000 , 044D , 013B , 0254 , 60AA , ( 420 KHZ FREQS + 40 0400 , 0786 , C227 , 03F1 , 4120 , ( 735 KHZ FREQS + 50 ( COMPANION TABLE OF XMIT FREQS IN KHZ DECIMAL CREATE KHZ 50 , 78 , 115 , 200 , 420 , 735 , DECIMAL ( ------------------------------------------------------------------- 200 IS DELAY2 ( TIME BETWEEN PINGS 15000 IS DELAY-ON ( TIME TO WAIT AFTER TRANSCEIVER POWER TURNED ON ( FP CONSTANTS 1.0E5 FIS TEN5 1.6383E4 FIS MAXN ( MAX ADC VALUE 1E6 FIS FCLOCK ( CLOCK RATE OF INTERNAL TIMER 5.0E-1 FIS ONE-HALF 1.0E-15 FIS EPS ( A SMALL VALUE 0.0E0 FIS ZERO 1.0E0 FIS ONE 1.0E1 FIS TEN 2.0E1 FIS V20 ( TURN-ON THRESHOLD VOLTAGE 990317 1.0E2 FIS HUNDRED -1.0E2 FIS MINUS100 6.25E-8 FIS SF2 ( CONVERT ACC TO V^2 ( ======================= SPI INIT SUBROUTINE ========================= ( INITIALIZE SPI BUS FOR ADC, DAC, DDS HEX CODE-SUB SPI-INIT ( CODE TO SETUP SPI I/O 4CD6 , 80 C, ( BSET PORTS,#$80 ; SET SS LINE HIGH 180B , E0 C, DDRS , ( MOVB #$E0,DDRS ; CONFIGURE PORT S DDR 180B , 02 C, SPOBR , ( MOVB #$02,SPOBR ; SET SCLK RATE = 1 MHZ 180B , 12 C, SPOCR1 , ( MOVB #$12,SPOCR1 ; MSTR=1, CPOL=CPHA=0 180B , 08 C, SPOCR2 , ( MOVB #$08,SPOCR2 ; SPI 2 OUTPUTS, ACTIVE 96D3 , ( LDAA SPOSR ; 1ST STEP TO CLEAR SPIF FLAG 96D5 , ( LDAA SPODR ; 2ND STEP TO CLEAR SPIF FLAG 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI 3D C, ( RTS END-CODE CODE-SUB SPI-ON 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI 3D C, ( RTS END-CODE CODE-SUB SPI-OFF 4DD0 , 40 C, ( BCLR SPOCR1,#$40 ; DISABLE SPI 3D C, END-CODE ( ;------------------------------------------------------------ ( ; PROGRAM TAPSTR.ASM ( ; 24 FEB 2006 ( ; 68HC12 SUBROUTINE TO GENERATE PINGS AND SAMPLE ECHOES ( ; FOR THE TAPS NEWGEN ( ; ( ; ASSUMES THE DDS, MUX, AND GAINS HAVE BEEN SET ( ; ( ; USES THE FREE-RUNNING TIMER TO SET PULSE LENGTHS AND ( ; SAMPLE INTERVALS ( ; ( ; Y REGISTER USED TO POINT TO FREQS TABLE ( ; X REGISTER USED TO POINT TO PREFIX TABLE ( ; ( ;------------------------- TAPSTR -------------------------- CODE-SUB TAPSTR ( MAIN: 3B C, ( PSHD ; SAVE D ACCUMULATOR 34 C, ( PSHX ; SAVE X REGISTER 35 C, ( PSHY ; SAVE Y REGISTER CE C, DATA , ( LDX #DATA ; POINT X AT TOP OF DATA ARRAY FC C, NSAMPS , ( LDD NSAMPS ; LOAD # OF SAMPLES 7C C, SCNTR , ( STD SCNTR ; INTO SAMPLE COUNTER 4D56 , 20 C, ( BCLR PORTP,#$20 ; ENSURE DDS SET TO XMIT FREQ 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI ( ; -------------- SET TVG AMP TO FIRST GAIN VALUE ------------ CD C, TVG , ( LDY #TVG ; POINT Y AT START OF TVG TABLE EC40 , ( LDD 0,Y ; READ IT 4D56 , 10 C, ( BCLR PORTP,#$10 ; ASSERT \DAC, PP4 5AD5 , ( STAA SPODR ; SEND HIGH BYTE TO DAC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* 96D5 , ( LDAA SPODR ; CLEAR DATA REGISTER 5BD5 , ( STAB SPODR ; SEND LOW BYTE TO DAC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* 96D5 , ( LDAA SPODR ; CLEAR DATA REGISTER 4C56 , 10 C, ( BSET PORTP,#$10 ; DE-ASSERT \DAC, PP4 02 C, ( INY 02 C, ( INY ; UPDATE TVG POINTER ( ; GENERATE THE TRANSMIT PULSE 4D8E , FE C, ( BCLR TFLG1,#~$01 ; CLEAR TIMER FLAG BIT 1 4D86 , 80 C, ( BCLR TSCR,#TEN ; STOP TIMER FC C, PULSE , ( LDD PULSE ; TIMER TICS FOR XMIT PULSE D384 , ( ADDD TCNT ; ADD TO VALUE OF TIMER COUNTER 5C90 , ( STD TCO ; INIT THE OC REGISTER WITH DELAY VALUE 4C86 , 80 C, ( BSET TSCR,#TEN ; RESTART THE COUNTER 4D56 , 80 C, ( BCLR PORTP,#$80 ; START XMIT GATE 4F8E , 01FC , ( BRCLR TFLG1,#$01,* ; WAIT UNTIL TIMER MATCHES NEW COUNT 4D8E , FE C, ( BCLR TFLG1,#~$01 ; CLEAR TIMER FLAG BIT 1 4C56 , 80 C, ( BSET PORTP,#$80 ; END OF XMIT PULSE 4C56 , 20 C, ( BSET PORTP,#$20 ; SELECT LO FREQ ( ; GENERATE A FIXED-LENGTH DELAY 4D86 , 80 C, ( BCLR TSCR,#TEN ; STOP TIMER FC C, PULSE , ( LDD PULSE 49 C, ( LSRD ; T/2 DELAY D384 , ( ADDD TCNT ; ADD TO VALUE OF TIMER COUNTER 5C90 , ( STD TCO ; INIT THE OC REGISTER WITH DELAY VALUE 4C86 , 80 C, ( BSET TSCR,#TEN ; RESTART THE COUNTER 4F8E , 01FC , ( BRCLR TFLG1,#$01,* ; WAIT UNTIL TIMER MATCHES NEW COUNT 4D8E , FE C, ( BCLR TFLG1,#~$01 ; CLEAR TIMER FLAG BIT 1 ( ; TAKE NSAMPS ECHO SAMPLES ( START WITH T/2 DELAY ( SAMPLE: 4D86 , 80 C, ( BCLR TSCR,#TEN ; STOP TIMER FC C, PULSE , ( LDD PULSE 49 C, ( LSRD ; T/2 DELAY D384 , ( ADDD TCNT ; ADD TO VALUE OF TIMER COUNTER 5C90 , ( STD TCO ; INIT THE OC REGISTER WITH DELAY VALUE 4C86 , 80 C, ( BSET TSCR,#TEN ; RESTART THE COUNTER 4D56 , 08 C, ( BCLR PORTP,#$08 ; ASSERT \ADC, PP3; START ADC SAMPLE 180B , 0000 , D5 C, ( MOVB #$00,SPODR ; SEND COMMAND BYTE TO ADC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE 96D5 , ( LDAA SPODR ; READ DUMMY VALUE 180B , 0000 , D5 C, ( MOVB #$00,SPODR ; SEND A DUMMY BYTE 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE 96D5 , ( LDAA SPODR ; READ HIGH BYTE OF RESULT 180B , 0000 , D5 C, ( MOVB #$00,SPODR ; SEND A DUMMY BYTE 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE D6D5 , ( LDAB SPODR ; READ LOW BYTE OF RESULT 4C56 , 08 C, ( BSET PORTP,#$08, ; DE-ASSERT \ADC 49 C, ( LSRD 49 C, ( LSRD ; SHIFT D RIGHT TWICE TO NORMALIZE 843F , ( ANDA #$3F ; MASK D TO $3FFF MAX 6C31 , ( STD 2,X+ ; SAVE WORD, INC X BY 2 ( ; -------------- SET TVG AMP TO NEXT GAIN VALUE ------------ EC40 , ( LDD 0,Y ; READ IT 4D56 , 10 C, ( BCLR PORTP,#$10 ; ASSERT \DAC, PP4 5AD5 , ( STAA SPODR ; SEND TO DAC2 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* 96D5 , ( LDAA SPODR ; CLEAR DATA REGISTER 5BD5 , ( STAB SPODR 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* 96D5 , ( LDAA SPODR ; CLEAR DATA REGISTER 4C56 , 10 C, ( BSET PORTP,#$10 ; DE-ASSERT \DAC, PP4 02 C, ( INY 02 C, ( INY ; UPDATE TVG POINTER 4F8E , 01FC , ( BRCLR TFLG1,#$01,* ; WAIT UNTIL TIMER MATCHES NEW COUNT 4D8E , FE C, ( BCLR TFLG1,#-01 ; CLEAR TIMER FLAG BIT 1 ( ; ---------------- CHECK IF DONE SAMPLING ------------------- FC C, SCNTR , ( LDD SCNTR ; FETCH SAMPLE COUNTER 83 C, 0001 , ( SUBD #01 ; SUBTRACT ONE 7C C, SCNTR , ( STD SCNTR ; SAVE UPDATED COUNTER 2699 , ( BNE SAMPLE ; TAKE ANOTHER SAMPLE? 31 C, ( PULY ; RESTORE STACK 30 C, ( PULX 3A C, ( PULD 3D C, ( RTS ; AND RETURN END-CODE ( =================== SOUNDER MAC =================================== ( SOUNDER-MODE MAC CODE - STACK POINTS AT BEGINNING ACCUMULATOR ( SQUARES AND SUMS 100 SAMPLES, SAVES IN ACCUM[I] ( ; PROGRAM NOAA_MAC.ASM ( ; 25 FEB 2011: VERSION FOR 6-FREQ EUPHAUSIID SYSTEM ( ; 68HC12 SUBROUTINE TO MAC THE ECHO SAMPLES IN SAMPLE ( ; THIS VERSION SCALES AMPS & SQUARED ECHO VALUES BY NPINGS ( ; AMP^4 DATA NOT SCALED ( ; EXITS WITH ECHO DATA SEQUENTIALLY IN ACCUM ( ; ( ; X REGISTER USED TO HOLD POINTER TO ACCUM[I] ( ; Y REGISTER USED TO HOLD POINTER TO SAMPLE ( ; CNTR USED AS RANGE-BIN COUNTER ( ; ( ; CALL WITH ADDRESS OF ACCUM ON STACK CODE-SUB MAC 3B C, ( PSHD ; SAVE D REGISTER 34 C, ( PSHX ; SAVE X REGISTER EE40 , ( LDX 0,Y ; X POINTS TO START OF ACCUM 02 C, ( INY ; ADJUST STACK POINTER 02 C, ( INY 35 C, ( PSHY ; SAVE Y REGISTER ( ; ADD CURRENT SAMPLES TO AMPLITUDE ACCUMULATOR ( ; X HOLDS POINTER TO ACCUM+200 ( ; Y HOLDS POINTER TO ECHO SAMPLE ARRAY CC C, 0064 , ( LDD #100 7C C, CNTR , ( STD CNTR ; PRESET A COUNTER FOR # OF SAMPLES CD C, SAMPLE , ( LDY #SAMPLE ; Y POINTS TO ECHO SAMPLE ARRAY ( AMPMAC: EC71 , ( LDD 2,Y+ ; GET ITH ECHO SAMPLE ( ; Y NOW POINTS TO NEXT SAMPLE 34 C, ( PSHX FE C, NPINGS , ( LDX NPINGS ; X = # PINGS 1810 , ( IDIV ; X = [D / X], D = REM B754 , ( TFR X,D ; MOVE X TO D 30 C, ( PULX ; X POINTS TO ACCUM AGAIN E300 , ( ADDD 0,X ; D = D + ACCUM(I) 6C31 , ( STD 2,X+ ; STORE SUM IN ACCUM(I) ( ; X NOW POINTS TO NEXT ACCUM FC C, CNTR , ( LDD CNTR 83 C, 0001 , ( SUBD #1 ; DECREMENT COUNTER 7C C, CNTR , ( STD CNTR 26E6 , ( BNE AMPMAC ( ; SQUARE SAMPLES AND ADD TO INTENSITY ACCUMULATOR ( ; X HOLDS POINTER TO ACCUM ( ; Y HOLDS POINTER TO ECHO SAMPLE ARRAY CC C, 0064 , ( LDD #100 7C C, CNTR , ( STD CNTR ; PRESET A COUNTER FOR # OF SAMPLES CD C, SAMPLE , ( LDY #SAMPLE ; Y POINTS TO SOURCE ARRAY ( INTMAC: ( ; PUT ITH SAMPLE INTO TSAMP EC71 , ( LDD 2,Y+ ; GET ITH ECHO SAMPLE ( ; Y NOW POINTS TO NEXT SAMPLE 7C C, TSAMP , ( STD TSAMP ; MOVE SAMPLE TO TSAMP ( ; PUT ITH ACCUM VALUE INTO TACCUM EC00 , ( LDD 0,X ; GET FIRST WORD OF ITH ACCUM 7C C, TACCUM , ( STD TACCUM ; PUT IN TACCUM EC02 , ( LDD 2,X ; GET SECOND WORD OF ITH ACCUM 7C C, TACCUM 2+ , ( STD TACCUM+2 ; PUT IN TACCUM ( ; MAC INTO TEMPORARY ACCUM 34 C, ( PSHX 35 C, ( PSHY CC C, 0000 , ( LDD #00 7C C, SACCUM , ( STD SACCUM 7C C, SACCUM 2+ , ( STD SACCUM+2 CE C, TSAMP , ( LDX #TSAMP ; POINT X AT TSAMP CD C, TSAMP , ( LDY #TSAMP ; POINT Y AT TSAMP 1812 , SACCUM , ( EMACS SACCUM ; MAC INTO SACCUM ( ; DIVIDE SACCUM BY NPINGS CD C, 0000 , ( LDY #0 FC C, SACCUM , ( LDD SACCUM ; D = UPPER WORD OF TACCUM FE C, NPINGS , ( LDX NPINGS ; X = NUMBER OF PINGS / AVERAGE 11 C, ( EDIV ; Y = 0:ACCH / NPINGS. D = REM 7D C, SACCUM , ( STY SACCUM ; SAVE HIGH WORD OF QUOTIENT B746 , ( TFR D,Y ; MOVE REM TO Y REG FC C, SACCUM 2+ , ( LDD SACCUM+2 ; D = LOWER WORD OF TACCUM FE C, NPINGS , ( LDX NPINGS ; X = NUMBER OF PINGS / AVERAGE 11 C, ( EDIV ; Y = REM:ACCL / NPINGS, D = REM 7D C, SACCUM 2+ , ( STY SACCUM+2 ; SAVE LOW WORD OF QUOTIENT ( ; ADD SACCUM AND TACCUM B6 C, SACCUM 3 + , ( LDAA SACCUM+3 BB C, TACCUM 3 + , ( ADDA TACCUM+3 7A C, TACCUM 3 + , ( STAA TACCUM+3 ; SUM OF LOW BYTES B6 C, SACCUM 2+ , ( LDAA SACCUM+2 B9 C, TACCUM 2+ , ( ADCA TACCUM+2 7A C, TACCUM 2+ , ( STAA TACCUM+2 ; SUM OF 2ND BYTES B6 C, SACCUM 1+ , ( LDAA SACCUM+1 B9 C, TACCUM 1+ , ( ADCA TACCUM+1 7A C, TACCUM 1+ , ( STAA TACCUM+1 ; SUM OF 3RD BYTES B6 C, SACCUM , ( LDAA SACCUM B9 C, TACCUM , ( ADCA TACCUM 7A C, TACCUM , ( STAA TACCUM ; SUM OF HIGH BYTES 31 C, ( PULY 30 C, ( PULX ( ; MOVE TEMPORARY ACCUM VALUE INTO ITH ACCUM LOCATION FC C, TACCUM , ( LDD TACCUM 6C31 , ( STD 2,X+ ; SAVE INTO ITH ACCUM FC C, TACCUM 2+ , ( LDD TACCUM+2 6C31 , ( STD 2,X+ ; X NOW POINTS TO I+1 ACCUM ( ; LOOP UNTIL 100 SAMPLES DONE FC C, CNTR , ( LDD CNTR 83 C, 0001 , ( SUBD #1 7C C, CNTR , ( STD CNTR 2688 , ( BNE INTMAC ( ---------------- INT2MAC SECTION ------------------------------ ( NOW SQUARE SAMPLES TWICE AND ADD TO ACCUMULATOR ( X HOLDS POINTER TO ACCUM + 600 ( Y HOLDS POINTER TO ECHO SAMPLES CC C, 0064 , ( LDD #100 7C C, CNTR , ( STD CNTR ; PRESET A COUNTER FOR # OF SAMPLES CD C, SAMPLE , ( LDY #SAMPLE ; Y POINTS TO ECHO SAMPLE ARRAY ( INT2MAC: EC71 , ( LDD 2,Y+ ; GET ITH SAMPLE, INC Y BY 2 34 C, ( PSHX 35 C, ( PSHY B746 , ( TFR D,Y ; COPY SAMPLE INTO Y 13 C, ( EMUL ; Y:D = SAMPLE^2 7D C, M , ( STY M ; SAVE IN BIG-ENDIAN FORMAT 7D C, N , ( STY N ; COPY IN BOTH N AND M 7C C, M 2+ , ( STD M+2 7C C, N 2+ , ( STD N+2 0750 , ( BSR SQUARE ; MULT P = M*N = A^4 31 C, ( PULY ; RECOVER SAMPLE POINTER 30 C, ( PULX ; RECOVER ACCUM POINTER ( NOW ADD 8-BYTES OF P TO ACCUM POINTED AT BY X B6 C, P 7 + , ( LDAA P+7 A907 , ( ADCA 7,X 6A07 , ( STAA 7,X ; ADD LOW BYTES TO ACCUM B6 C, P 6 + , ( LDAA P+6 A906 , ( ADCA 6,X 6A06 , ( STAA 6,X B6 C, P 5 + , ( LDAA P+5 A905 , ( ADCA 5,X 6A05 , ( STAA 5,X B6 C, P 4 + , ( LDAA P+4 A904 , ( ADCA 4,X 6A04 , ( STAA 4,X B6 C, P 3 + , ( LDAA P+3 A903 , ( ADCA 3,X 6A03 , ( STAA 3,X B6 C, P 2 + , ( LDAA P+2 A902 , ( ADCA 2,X 6A02 , ( STAA 2,X B6 C, P 1 + , ( LDAA P+1 A901 , ( ADCA 1,X 6A01 , ( STAA 1,X B6 C, P , ( LDAA P A900 , ( ADCA 0,X ; ADD HIGH BYTES 6A00 , ( STAA 0,X B754 , ( TFR X,D C3 C, 0008 , ( ADDD #08 B745 , ( TFR D,X ; X + 8 ( LOOP UNTIL 100 SAMPLES DONE FC C, CNTR , ( LDD CNTR 83 C, 0001 , ( SUBD #1 7C C, CNTR , ( STD CNTR 269F , ( BNE INT2MAC ( EXIT WHEN FINISHED 31 C, ( PULY 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD 3D C, ( RTS ; RETURN ( SQUARE SUBROUTINE ( SQUARE: FC C, M 2+ , ( LDD M+2 FD C, N 2+ , ( LDY N+2 13 C, ( EMUL 7D C, P 4 + , ( STY P+4 7C C, P 6 + , ( STD P+6 FC C, M , ( LDD M FD C, N , ( LDY N 13 C, ( EMUL 7D C, P , ( STY P 7C C, P 2+ , ( STD P+2 ; DONE WITH THE EASY PARTS ( ; COMPUTE MH * NL FC C, M , ( LDD M FD C, N 2+ , ( LDY N+2 13 C, ( EMUL F3 C, P 4 + , ( ADDD P+4 7C C, P 4 + , ( STD P+4 B764 , ( TFR Y,D F9 C, P 3 + , ( ADCB P+3 7B C, P 3 + , ( STAB P+3 B9 C, P 2+ , ( ADCA P+2 7A C, P 2+ , ( STAA P+2 ( ; PROPOGATE CARRY TO MSB B6 C, P 1+ , ( LDAA P+1 8900 , ( ADCA #0 7A C, P 1+ , ( STAA P+1 B6 C, P , ( LDAA P 8900 , ( ADCA #0 7A C, P , ( STAA P ( ; COMPUTE ML * NH FC C, M 2+ , ( LDD M+2 FD C, N , ( LDY N 13 C, ( EMUL F3 C, P 4 + , ( ADDD P+4 7C C, P 4 + , ( STD P+4 B764 , ( TFR Y,D F9 C, P 3 + , ( ADCB P+3 7B C, P 3 + , ( STAB P+3 B9 C, P 2+ , ( ADCA P+2 7A C, P 2+ , ( STAA P+2 ( ; PROPOGATE CARRY TO MSB B6 C, P 1+ , ( LDAA P+1 8900 , ( ADCA #0 7A C, P 1+ , ( STAA P+1 B6 C, P , ( LDAA P 8900 , ( ADCA #0 7A C, P , ( STAA P 3D C, ( RTS END-CODE ( ===================================================================== ( 10 MARCH 2005 ( 68HC12 SUBROUTINE: ( SENDS TWO FREQUENCIES TO DDS FROM FREQS TABLE ( ( USES PREFIX TABLE TO SEND ADDRESS CODES ( AND FREQS TABLE TO SEND MUX/GAIN/FREQ CODES ( ( ENTER WITH OFFSET INTO FREQ TABLE ON STACK ( ( LAYOUT IS TT-- FFFF FFFF LLLL LLLL ( WHERE TT IS THE CHAN/GAIN CODE FOR PORT-T ( FFFF FFFF IS THE CODE FOR 2*XMIT FREQ ( LLLL LLLL IS THE CODE FOR THE LO FREQ ( ( Y REGISTER USED TO POINT TO FREQS TABLE ( X REGISTER USED TO POINT TO PREFIX TABLE ( ( --------------------------------------------------------- CODE-SUB SEND-FREQS 3B C, ( PSHD ; SAVE D ACCUMULATOR 34 C, ( PSHX ; SAVE X REGISTER EC40 , ( LDD 0,Y ; READ FREQ TABLE POINTER FROM STACK 02 C, ( INY 02 C, ( INY ; ADJUST STACK POINTER 35 C, ( PSHY ; SAVE Y REGISTER B746 , ( TFR D,Y ; PUT FREQ TABLE POINTER IN Y CE C, PREFIX , ( LDX #PREFIX ; POINT X AT TOP OF PREFIX TABLE 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI ( SETUP THE CHANNEL/MUX/RECEIVER GAIN 86FC , ( LDAA #$FC ; BITS 7-2 OUTPUT, 1-0 INPUT 7A C, DDRT , ( STAA DDRT ; SETUP DATA DIRECTION REGISTER A670 , ( LDAA 1,Y+ ; GET THE CHAN/MUX CODE FROM THE TABLE 5AAE , ( STAA PORTT ; SET PORT-T 02 C, ( INY ( SETUP THE DDS CC C, D800 , ( LDD #$D800 ; DDS PREAMBLE 071B , ( BSR SENDIT CC C, A000 , ( LDD #$A000 0716 , ( BSR SENDIT ( LOOP: A630 , ( LDAA 1,X+ ; GET BYTE FROM PREFIX TABLE, INC X 2706 , ( BEQ DONE ; IF = 0, END OF TABLE E670 , ( LDAB 1,Y+ ; GET BYTE FROM FREQS TABLE, INC Y 070E , ( BSR SENDIT 20F6 , ( BRA LOOP ; DO ANOTHER ( DONE: CC C, C000 , ( LDD #$C000 ; ENERGIZE! 0707 , ( BSR SENDIT 4D56 , 20 C, ( BCLR PORTP,#$20 ; SELECT F0 31 C, ( PULY ; RESTORE STACK 30 C, ( PULX 3A C, ( PULD 3D C, ( RTS ; AND RETURN ( -------------- SENDIT SUBROUTINE ------------------------ ( SENDIT: 4D56 , 40 C, ( BCLR PORTP,#$40 ; ASSERT /FRAME SYNC 5AD5 , ( STAA SPODR ; SEND HIGH BYTE 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR XMISSION COMPLETE 5BD5 , ( STAB SPODR ; SEND LOW BYTE 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* 4C56 , 40 C, ( BSET PORTP,#$40 ; RESET /FRAME SYNC 3D C, ( RTS END-CODE CODE-SUB SET-XMIT-FREQ 4D56 , 20 C, ( BCLR PORTP,#$20 ; SELECT F0 = XMIT FREQUENCY 3D C, ( RTS END-CODE CODE-SUB SET-LO-FREQ 4C56 , 20 C, ( BSET PORTP,#$20 ; SELECT F1 = LOCAL OSCILLATOR FREQ 3D C, ( RTS END-CODE ( ------------------------ R-T CLOCK ROUTINES ---------------------------- ( INITIALIZE SPI BUS FOR RTC CODE-SUB RTC-SPI-INIT ( CODE TO SETUP SPI I/O FOR RTC 4CD6 , 80 C, ( BSET PORTS,#$80 ; SET SS LINE HIGH 180B , E0 C, DDRS , ( MOVB #$E0,DDRS ; CONFIGURE PORT S DDR 180B , 02 C, SPOBR , ( MOVB #$02,SPOBR ; SET SCLK RATE = 1 MHZ 180B , 16 C, SPOCR1 , ( MOVB #$16,SPOCR1 ; MSTR=1, CPOL=0 CPHA=1 180B , 08 C, SPOCR2 , ( MOVB #$08,SPOCR2 ; SPI 2 OUTPUTS, ACTIVE PULLUPS 96D3 , ( LDAA SPOSR ; 1ST STEP TO CLEAR SPIF FLAG 96D5 , ( LDAA SPODR ; 2ND STEP TO CLEAR SPIF FLAG 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI 3D C, ( RTS END-CODE ( INITIALIZE THE RTC CODE-SUB RTC-INIT 3B C, ( PSHD ; SAVE D REGISTER 4D C, 5604 , ( BCLR PORTP,#$04 ; ASSERT \RTC, FREEZE REGISTERS 868E , ( LDAA #$8E ; GET CONTROL REG ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 8606 , ( LDAA #$06 ; ENABLE ALARM2 + INT 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 4C C, 5604 , ( BSET PORTP,#$04 ; DE-ASSERT \RTC 3A C, ( PULD 3D C, ( RTS END-CODE ( SUBROUTINE TO HANDLE RTC INTERRUPTS CODE-SUB RTCINT 3B C, ( PSHD ; SAVE D REGISTER 4D C, 5604 , ( BCLR PORTP,#$04 ; ASSERT \RTC 868F , ( LDAA #$8F ; GET WRITE ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 86B0 , ( LDAA #$B0 ; CLEAR CONTROL REG 5AD5 , ( STAA SPODR ; WRITE TO SPI 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT TILL SENT 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 3A C, ( PULD 3D C, ( RTS ; RETURN END-CODE ( ; RTC CONTROL CODES ( ; 05 APRIL 2011 ( ; SUBROUTINES TO READ OR WRITE THE RTC CODE-SUB READ-CLOCK 3B C, ( PSHD ; SAVE D REGISTER 34 C, ( PSHX ; SAVE X REGISTER 35 C, ( PSHY ; SAVE Y REGISTER CE C, RTC , ( LDX #RTC ; X -> RTC DATA ARRAY 4D C, 5604 , ( BCLR PORTP,#$04 ; ASSERT \RTC, FREEZE REGISTERS 8600 , ( LDAA #$00 ; GET STARTING READ ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE CD C, 0007 , ( LDY #07 ; SETUP COUNTER TO READ 7 BYTES ( READ_LOOP: 180B , 0000 , D5 C, ( MOVB #$00, SPODR ; SEND DUMMY BYTE TO SPI 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 96D5 , ( LDAA SPODR ; READ BYTE & CLEAR DATA FLAG 6A30 , ( STAA 1,X+ ; SAVE TO RTC ARRAY, INC X 03 C, ( DEY ; DECREMENT COUNTER 26F0 , ( BNE READ_LOOP 4C C, 5604 , ( BSET PORTP,#$04 ; DE-ASSERT \RTC 31 C, ( PULY 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD 3D C, ( RTS ; RETURN END-CODE ( CALL WRITE-CLOCK WITH ADDRESS AND NUMBER OF BYTES ON STACK CODE-SUB WRITE-CLOCK 3B C, ( PSHD ; SAVE D REGISTER 34 C, ( PSHX ; SAVE X REGISTER EC40 , ( LDD 0,Y ; READ #BYTES 7C C, BUFF , ( STD BUFF ; SAVE 02 C, ( INY 02 C, ( INY ; ADJUST STACK POINTER EC40 , ( LDD 0,Y ; READ SOURCE ADR B745 , ( TFR D,X ; X POINTS TO SOURCE 02 C, ( INY 02 C, ( INY ; ADJUST STACK POINTER 35 C, ( PSHY ; SAVE Y REGISTER 4D C, 5604 , ( BCLR PORTP,#$04 ; ASSERT \RTC, FREEZE REGISTERS 8680 , ( LDAA #$80 ; GET STARTING WRITE ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE FD C, BUFF , ( LDY BUFF ; READ COUNTER VALUE ( WRITE_LOOP: A630 , ( LDAA 1,X+ ; READ BYTE FROM RTC ARRAY 5AD5 , ( STAA SPODR ; WRITE TO SPI 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT TILL SENT 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 03 C, ( DEY 26F3 , ( BNE WRITE_LOOP ; CONTINUE TILL ALL SENT 4C C, 5604 , ( BSET PORTP,#$04 ; DE-ASSERT \RTC 31 C, ( PULY 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD 3D C, ( RTS ; RETURN END-CODE ( ------------------------ ADC ROUTINE ----------------------------------- ( ( ADC ROUTINE - TAKES 16 SAMPLES PER CALL, STORES IN DATA ( ENTER WITH CHANNEL CODE ON STACK CODE-SUB TAPSADC 3B C, ( PSHD ; SAVE D ACCUMULATOR 34 C, ( PSHX ; SAVE X REGISTER EC40 , ( LDD 0,Y ; READ CHANNEL CODE 7C C, SCNTR , ( STD SCNTR ; SAVE CHANNEL CODE 02 C, ( INY 02 C, ( INY ; FIX STACK 35 C, ( PSHY ; SAVE Y REGISTER CE C, DATA , ( LDX #DATA ; POINT X AT START OF DATA CD C, 0010 , ( LDY #16 ; SETUP SAMPLE COUNTER 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI ( ; TAKE 16 ADC SAMPLES ( ; BEGIN WITH SHORT DELAY ( SAMPLE: 4D C, 8680 , ( BCLR TSCR,#TEN ; STOP TIMER CC C, 0500 , ( LDD #$500 ; ARBITRARY DELAY D384 , ( ADDD TCNT ; ADD TO VALUE OF TIMER COUNTER 5C90 , ( STD TCO ; INIT THE OC REGISTER WITH DELAY VALUE 4C C, 8680 , ( BSET TSCR,#TEN ; RESTART THE COUNTER 4F8E , 01FC , ( BRCLR TFLG1,#$01,* ; WAIT UNTIL TIMER MATCHES NEW COUNT 4D C, 8EFF , ( BCLR TFLG1,#-01 ; CLEAR TIMER FLAG BIT 1 4D C, 5608 , ( BCLR PORTP,#$08 ; ASSERT \ADC1, PP3; START ADC SAMPLE B6 C, SCNTR , ( LDAA SCNTR ; GET CHANNEL CODE 5AD5 , ( STAA SPODR ; SEND COMMAND BYTE TO ADC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE 96D5 , ( LDAA SPODR ; READ DUMMY DATA 180B , 0000 , D5 C, ( MOVB #$00,SPODR ; SEND A DUMMY BYTE TO ADC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE 96D5 , ( LDAA SPODR ; READ HIGH BYTE OF RESULT 180B , 0000 , D5 C, ( MOVB #$00,SPODR ; SEND ANOTHER DUMMY BYTE 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR DATA GONE D6D5 , ( LDAB SPODR ; READ LOW BYTE OF RESULT 4C C, 5608 , ( BSET PORTP,#$08, ; DE-ASSERT \ADC 49 C, ( LSRD 49 C, ( LSRD ; SHIFT D RIGHT TWICE TO NORMALIZE 843F , ( ANDA #$3F ; MASK D TO $3FFF MAX 6C31 , ( STD 2,X+ ; SAVE WORD, INC X ( ; ---------------- CHECK IF DONE SAMPLING ------------------- 03 C, ( DEY ; DECREMENT COUNTER 26BA , ( BNE SAMPLE ; IF >0, TAKE ANOTHER SAMPLE 31 C, ( PULY ; RESTORE STACK 30 C, ( PULX 3A C, ( PULD 3D C, ( RTS ; AND RETURN END-CODE ( ==================== POWER CONTROL ============================ ( CONTROL POWER TO EXTERNAL CARDS CODE-SUB TRANS-ON 4CFE , 40 C, ( BSET PDLC,#$40 ; ENABLE TRANS POWER 3D C, ( RTS ; PORT PDLC6 END-CODE CODE-SUB TRANS-OFF 4DFE , 40 C, ( BCLR PDLC,#$40 ; DISABLE TRANS POWER 3D C, ( RTS ; PORT PDLC6 END-CODE ( CONTROL POWER TO CONTROLLER PERIPHERAL CHIPS CODE-SUB IOB-ON 180B , FD C, PORTP , ( MOVB #$FD,PORTP ; POWER ON, BITS = 1 3D C, ( RTS END-CODE CODE-SUB IOB-OFF 180B , 02 C, PORTP , ( MOVB #$0A,PORTP ; POWER OFF, BITS = 0 3D C, ( RTS END-CODE ( ====================== 2+! ROUTINE ============================= : 2+! ( DBL ADR - ) ROT ROT SUM 2! ( SAVE DBLE VALUE TO TEMP DUP 2@ ( FETCH DBLE FROM ADDRESS SUM 2@ D+ ( ADD STORED VALUE ROT 2! ( SAVE TO ADDRESS ; ( ============================ M/ CODE ================================ ( DIVIDES UNSIGNED DOUBLE BY UNSIGNED SINGLE ( OUTPUTS DOUBLE UNSIGNED QUOTIENT AND SINGLE REMAINDER ( ( STACK: ( UD UN -- UREM UQUOTIENT ) CODE-SUB M/ 3B C, ( PSHD ; SAVE D ON STACK 34 C, ( PSHX ; SAVE X ON STACK 35 C, ( PSHY ; SAVE Y ON STACK B765 , ( TFR Y,X ; X IS NOW THE DATA STACK POINTER EC00 , ( LDD 0,X 6C2E , ( STD 2,-X ; DUP UN 34 C, ( PSHX EC04 , ( LDD 4,X ; D = UDH CD C, 0000 , ( LDY #0 ; 0:UDH / UN EE00 , ( LDX 0,X 11 C, ( EDIV ; Y = QUOTH, D = REMH 2412 , ( BCC MU1 ; IF DIV BY 0 30 C, ( PULX 1A02 , ( LEAX 2,X CC C, FFFF , ( LDD #$FFFF ; REM, QUOT = $FFFF 6C00 , ( STD 0,X 6C02 , ( STD 2,X 6C04 , ( STD 4,X B756 , ( TFR X,Y ; MAKE Y THE DATA STACK POINTER AGAIN 31 C, ( PULY ; RECOVER Y 30 C, ( PULX ; RECOVER X 3A C, ( PULD ; RECOVER D 3D C, ( RTS ( MU1 30 C, ( PULX 6D02 , ( STY 2,X ; QUOTH 6C04 , ( STD 4,X ; REMH ED04 , ( LDY 4,X ; Y = REMH EC06 , ( LDD 6,X ; D = UDL 34 C, ( PSHX EE00 , ( LDX 0,X ; X = UN 11 C, ( EDIV ; Y = QUOTL, D = REML 30 C, ( PULX 6C06 , ( STD 6,X ; REML 6D04 , ( STY 4,X ; QUOTL 1A02 , ( LEAX 2,X B756 , ( TFR X,Y ; MAKE Y THE DATA STACK POINTER AGAIN 31 C, ( PULY ; RECOVER Y 30 C, ( PULX ; RECOVER X 3A C, ( PULD ; RECOVER D 3D C, ( RTS END-CODE ( --------------------------------------------------------------------- ( THIS CODE WRITES 512 BYTES STARTING AT SOURCE TO CF ( CALL WITH SOURCE ADDRESS ON STACK CODE-SUB WRITE-CF 3B C, ( PSHD ; SAVE D ACCUMULATOR 34 C, ( PSHX ; SAVE X REGISTER EC40 , ( LDD 0,Y ; READ SOURCE ADDRESS 7C C, SOURCE , ( STD SOURCE 02 C, ( INY 02 C, ( INY ; ADJUST STACK POINTER 35 C, ( PSHY ( ; SETUP SECTOR ADDRESS VALUES 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 8601 , ( LDAA #01 7A C, SCTRCNT , ( STAA SCTRCNT CD C, FADR , ( LDY #FADR ; POINT Y AT FLASH ADDRESS 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A643 , ( LDAA 3,Y ; SET L BYTE OF ADDRESS 7A C, LBA0 , ( STAA LBA0 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A642 , ( LDAA 2,Y ; SET ML BYTE OF ADDRESS 7A C, LBA1 , ( STAA LBA1 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A641 , ( LDAA 1,Y ; SET MH BYTE OF ADR 7A C, LBA2 , ( STAA LBA2 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A640 , ( LDAA 0,Y ; SET H BYTE OF ADR 840F , ( ANDA #$0F ; ONLY USE LOW 4 BITS 8AE0 , ( ORA #$E0 ; SET CF1, LBA ENABLED 7A C, LBA3 , ( STAA LBA3 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 8630 , ( LDAA #WRITE 7A C, COMMAND , ( STAA COMMAND ; SET MODE TO WRITE ( WRITE A BLOCK OF 512 BYTES INTO FLASH, CHECKING RDY=1 BEFORE EACH WRITE FE C, SOURCE , ( LDX SOURCE ; X POINTS AT BUFFER CD C, CFDATA , ( LDY #CFDATA ; Y POINTS AT DATA PORT TO FLASH C600 , ( LDB #256 ; B COUNTS WORDS ( WORDMOVE: 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 180A , 3070 , ( MOVB 1,X+,1,Y+ ; MOVE A BYTE, POST-INCREMENT 03 C, ( DEY ; ADJUST Y BACK TO DATA 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 180A , 3070 , ( MOVB 1,X+,1,Y+ ; MOVE A BYTE, POST-INCREMENT 03 C, ( DEY 04 C, 31EB , ( DBNE B,WORDMOVE ; CONTINUE TILL ALL ARE MOVED 31 C, ( PULY 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD ; AND ACCUMULATOR 3D C, ( RTS END-CODE ( READ ONE BLOCK OF DATA FROM CF-RAM TO BUFFER CODE-SUB READ-CF 3B C, ( PSHD ; SAVE D ACCUMULATOR 34 C, ( PSHX ; SAVE X REGISTER 35 C, ( PSHY ( ; SETUP SECTOR ADDRESS VALUES 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 8601 , ( LDAA #01 7A C, SCTRCNT , ( STAA SCTRCNT CD C, FADR , ( LDY #FADR ; POINT Y AT FLASH ADDRESS 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A643 , ( LDAA 3,Y ; LB OF ADDRESS 7A C, LBA0 , ( STAA LBA0 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A642 , ( LDAA 2,Y ; ML BYTE OF ADDRESS 7A C, LBA1 , ( STAA LBA1 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A641 , ( LDAA 1,Y ; SET LOW BYTE OF ADR 7A C, LBA2 , ( STAA LBA2 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH A640 , ( LDAA 0,Y ; SET HIGH BYTE OF ADR 840F , ( ANDA #$0F ; ONLY USE LOW 4 BITS 8AE0 , ( ORA #$E0 ; SET CF1, LBA ENABLED 7A C, LBA3 , ( STAA LBA3 ; SET HIGH BYTE OF ADR 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH 8620 , ( LDAA #READ 7A C, COMMAND , ( STAA COMMAND ; SET MODE TO READ ( READ A BLOCK OF 512 BYTES INTO RAM, CHECKING RDY=1 BEFORE EACH WRITE CD C, BUFFER , ( LDY #BUFFER ; X POINTS AT BUFFER C600 , ( LDB #256 ; B COUNTS WORDS ( WORDMOVE: 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH B6 C, CFDATA , ( LDAA CFDATA ; READ A BYTE 6A40 , ( STAA 0,Y ; SAVE TO BUFFER 4F6F , 01FC , ( BRCLR PORTAD,#$01,* ; ENSURE RDY IS HIGH B6 C, CFDATA , ( LDAA CFDATA 6A41 , ( STAA 1,Y 0202 , ( INY 2X 04 C, 31E9 , ( DBNE B,WORDMOVE ; CONTINUE TILL ALL ARE MOVED 31 C, ( PULY 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD ; AND ACCUMULATOR 3D C, ( RTS END-CODE DECIMAL : READ-EEPROM ( 021115: FROM FREQ1 THROUGH POFFSET 14 0 DO MYCALS I 2* + @ SERNO I 2* + ! LOOP LASTCOUNT @ DATACNTR ! LASTCOUNT 2+ 2@ FADR 2! ; : WRITE-COUNTER DATACNTR @ LASTCOUNT EE! FADR @ LASTCOUNT 2+ EE! FADR 2+ @ LASTCOUNT 4 + EE! ; : WRITE-EEPROM ( MOVE DATA TO EEPROM STARTING AT DATASPACE 15 0 DO SERNO I 2* + @ ( READ A WORD FROM RAM MYCALS I 2* + EE! ( WRITE THE WORD TO EEPROM LOOP ; ( ------------------- COMPACT FLASH RAM ROUTINES ----------------------- HEX : BUSY? ( - ) 100 0 DO STATUS C@ ( READ STATUS REGISTER 80 AND ( MASK BIT 7 0= ( IS IT CLEAR? IF LEAVE THEN ( IF SO, QUIT LOOP LOOP ; DECIMAL : GET-REGS ( READ CF REGISTERS & SETUP SECTOR ADDRESS BUSY? LBA0 C@ FADR C! LBA1 C@ FADR 1 + C! LBA2 C@ FADR 2 + C! HEAD C@ FADR 3 + C! ; HEX : SETUP-CF BUSY? 01 FEATURES C! ( ENABLE 8-BIT DATA TRANSFER BUSY? FADR C@ LBA3 C! BUSY? FADR 1+ C@ LBA2 C! BUSY? FADR 2 + C@ LBA1 C! BUSY? FADR 3 + C@ F0 AND E0 OR LBA0 C! BUSY? EF COMMAND C! ( EXECUTE COMMANDS JUST LOADED BUSY? ; HEX : RESET-CF 1000. FADR 2! ( START OF DATA SPACE IN CF-RAM ; DECIMAL : INC-SECTOR ( - ) ( INCREMENT SECTOR ADDRESS BY ONE FADR 2@ 1. D+ FADR 2! ; : DEC-SECTOR ( - ) ( DECREMENT SECTOR ADDRESS BY ONE FADR 2@ 1. D- FADR 2! ; : YES? ( CHAR - FLAG ) DUP 89 = SWAP 121 = OR ; : ERASE-RAM ." ERASE DATA (Y/N)? " KEY DUP EMIT YES? IF RESET-CF ( RESET SECTOR ADDRESS COUNTER 0 DATACNTR ! ( CLEAR DATA SET COUNTER SETUP-CF ( SAVE CF REGISTERS WRITE-COUNTER ( AND SAVE TO EEPROM THEN CR ; ( ------------------------ TEXT I/O ROUTINES ----------------------------- : BUFF-INIT BUFF 16 BLANK ; : GET-STRING BUFF-INIT BUFF 16 EXPECT ; : GET3NUM ( CONVERT STRING INTO UP TO 3 NUMBERS 0 0 0 NUM1 ! NUM2 ! NUM3 ! ( CLEAR RESULT REGISTERS BUFF-INIT GET-STRING ( READ THE INPUT STRING BUFF C@ ( GOOD-DIGIT? ( IS FIRST CHARACTER A DIGIT? IF 0 0 BUFF 1- CONVERT ( CONVERT UNTIL NON-NUMBER FOUND ROT ROT DROP NUM1 ! ( SAVE THE FIRST NUMBER 1+ DUP C@ ( GOOD-DIGIT? ( VALID DIGIT? IF 0. ROT 1- CONVERT ( CONVERT UNTIL NON-NUMBER FOUND ROT ROT DROP NUM2 ! ( SAVE THE FIRST NUMBER 1+ DUP C@ ( GOOD-DIGIT? ( VALID DIGIT? IF 0. ROT 1- CONVERT ( CONVERT UNTIL NON-NUMBER FOUND ROT ROT DROP NUM3 ! ( SAVE THE FIRST NUMBER THEN THEN THEN DROP ( CLEAN BUFF ADDRESS OFF STACK ; DECIMAL : BUFF-FIX BUFF C@ DUP 45 = IF DROP ELSE 48 MAX 57 MIN BUFF C! THEN 16 1 DO I BUFF + C@ DUP 32 = IF DROP ELSE 48 MAX 57 MIN I BUFF + C! THEN LOOP ; : GET-DAT ( - DBL ) 2 SPACES GET-STRING BUFF-FIX ( BE SURE INPUT IS NUMBER BUFF 1- NUMBER CR ; : SAVENUM ( DBL ADR - ) SWAP DROP ( NUM ADR ) SPAN @ 0> IF ! ELSE 2DROP THEN ; ( FORMATTED HEX-ASCII OUTPUT ROUTINES -- ALL USE DBLE-WORD INPUTS : HOUT ( D - ) <# # # # # # # # # #> TYPE ; : HOUT2 ( D - ) <# # # # # #> TYPE ; : OUT3DIGIT ( D - ) 0 <# # # # 46 HOLD #S #> TYPE ; ( PRINT THE DATA IN BUFFER AS ASCII-HEX; CONVERT NON-PRINTABLES ( TO SPACES. NOTE THAT FIRST TWO CHARACTERS OF EACH DATA SET ARE ( THE DATA LENGTH; THESE MAY NOT CONVERT TO PRINTABLES. ALWAYS ( IGNORE THE FIRST TWO CHARACTERS! DECIMAL : PRINT-BUFFER ( - ) HEX 256 0 DO I 2 * BUFFER + @ ( GET A DBL-WORD 0 HOUT2 ( PRINT AS 4 HEX DIGITS LOOP DECIMAL ; ( READ DATA FROM CF-RAM, FORMAT, AND PRINT TO SIO ( READS ONE SECTOR AT A TIME TO BUFFER, PRINTS THE RESULTS DECIMAL : DUMP-ALL-DATA ( - ) CR ." DUMPING DATA -- TURN ON DATA CAPTURE" CR ." PRESS ANY KEY WHEN READY " CR KEY DROP DATACNTR @ 0 = IF ." NO DATA IN MEMORY! " CR EXIT THEN FADR 2@ TEMP-FADR 2! ( SAVE CURRENT SECTOR NUMBER RESET-CF ( START AT BEGINNING DATACNTR @ 0 DO ( LOOP OVER # DATA SETS NUMBLOCKS 0 DO ( LOOP OVER # BLOCKS/DATA SET READ-CF INC-SECTOR ( READ FIRST SECTOR OF DATA PRINT-BUFFER ( PRINT OUT SIO PORT LOOP CR ( SEPARATE DATA SETS W/ LOOP TEMP-FADR 2@ FADR 2! ( RESTORE SECTOR POINTER CR ." END OF DATA " CR ( FADR NOW = TEMP-FADR ; : PACE-DATA ( - ) CR ." DUMPING DATA -- TURN ON DATA CAPTURE" CR ." PRESS ANY KEY WHEN READY " CR KEY DROP DATACNTR @ 0 = IF ." NO DATA IN MEMORY! " CR EXIT THEN FADR 2@ TEMP-FADR 2! ( SAVE CURRENT SECTOR NUMBER RESET-CF ( START AT BEGINNING NCHUNKS @ CNTR ! DATACNTR @ 0 DO ( LOOP OVER # DATA SETS NUMBLOCKS 0 DO ( LOOP OVER # BLOCKS/DATA SET READ-CF INC-SECTOR ( READ FIRST SECTOR OF DATA PRINT-BUFFER ( PRINT OUT SIO PORT LOOP CR CR ( SEPARATE DATA SETS W/ CNTR @ 1- DUP CNTR ! 0= IF CR ." CHANGE CAPTURE FILES AND PRESS " KEY DROP CR NCHUNKS @ CNTR ! ." DUMPING " CNTR @ . ." BLOCKS OF DATA " CR THEN LOOP TEMP-FADR 2@ FADR 2! ( RESTORE SECTOR POINTER ; : DUMP-DATA ( - ) CR ." DO YOU WANT TO PACE THE OUTPUT (Y/N)? " KEY DUP EMIT CR YES? IF ." HOW MANY DATASETS PER OUTPUT? " GET-DAT DROP NCHUNKS ! PACE-DATA ELSE DUMP-ALL-DATA THEN ; : SET-DATACNTR ( - ) CR ." ENTER # DATA BLOCKS TO DUMP: " GET-DAT DROP DATACNTR ! CR ; ( SAVES DATA TO CF-RAM AFTER DO-SNDR PUTS IT IN DATASPACE : SAVE-DATA ( - ) NUMBLOCKS 0 DO ( # SECTORS TO SAVE I 512 * DATASPACE + ( CALC START OF 512 BYTE DATA WRITE-CF INC-SECTOR ( SAVE A SECTOR & INC FADR 42 EMIT ( TYPE AN * LOOP CR DATACNTR 1+! ( INCREMENT DATA COUNTER WRITE-COUNTER ( SAVE TO EEPROM ; DECIMAL : S>D ( CONVERT SINGLE INTEGER TO DBL INTEGER ( PUT 0 ON TOP OF STACK IF POSITIVE #. ELSE PUT -1 DUP 0< ( NEG NUMBER? IF -1 ELSE 0 THEN ; : BS 16 0 DO 8 EMIT LOOP ; HEX : TIC-INIT FC TIOS C! ( TIMER BITS 0-1 AS INPUT CAPTURE 33 TMSK2 C! ( SET TIMER TO 1 US TICKS 80 TSCR C! ( ENABLE TIMER ; DECIMAL ( -------------------- WAIT BEFORE PINGING -------------------- : WAIT-ON ( - ) DELAY-ON 0 DO ( LOOP FIXED LENGTH OF TIME 10 0 DO I DROP LOOP LOOP ; : WAIT-TEST 4000 0 DO I DROP LOOP ; ( ---------------- READ BATTERY VOLTAGE --------------------- DECIMAL : DV 8192 TAPSADC ( DUMMY READ ON CH1 8192 TAPSADC ( READ 16 SAMPLES FROM CH1 0. 16 0 DO I 2* DATA + @ ( GET A VALUE 0 D+ ( MAKE DOUBLE & ADD TO SUM LOOP 64 M/ ( NORMALIZE, SCALE TO MV DROP DUP VBAT ! ( CONVERT TO SINGLE AND SAVE S>D D>F ( FLOAT VALUE VBATSF F@ F* ( CONVERT TO BATTERY VOLTAGE FDUP ( COPY HUNDRED F* F>D DROP VBAT ! ( SAVE 100*VBATTERY IN VBAT 2 PLACES F. DROP ( PRINT, DROP REMAINDER OFF STACK ; : GET-VOLTS IOB-ON SPI-INIT WAIT-TEST SPI-ON DV SPI-OFF IOB-OFF CR ; ( -------------------- CLOCK ROUTINES ----------------------- ( ROUTINES TO CONTROL DALLAS SEMI DS3234 CLOCK : SET-TIME ." ENTER TIME AS HH MM SS: " GET3NUM ( READ AND TURN INTO 3 NUMBERS NUM1 @ HOUR C! NUM2 @ MINUTE C! NUM3 @ SECOND C! CR ; : SET-DATE ." ENTER DATE AS YY MM DD: " GET3NUM ( READ AND TURN INTO 3 NUMBERS NUM1 @ YEAR C! NUM2 @ MONTH C! NUM3 @ DAY C! CR ; : FORMAT-TIME SECOND C@ 10 / 16 * ( FORM 10'S SECS SECOND C@ DUP 10 / 10 * - ( FORM SEC'S + WRTC C! MINUTE C@ 10 / 16 * MINUTE C@ DUP 10 / 10 * - ( MINUTES + WRTC 1+ C! HOUR C@ 10 / 16 * HOUR C@ DUP 10 / 10 * - + WRTC 2+ C! ( HOUR 0 WRTC 3 + C! ( CLEAR DAY OF WEEK DAY C@ 10 / 16 * DAY C@ DUP 10 / 10 * - + WRTC 4 + C! ( DAY MONTH C@ 10 / 16 * MONTH C@ DUP 10 / 10 * - + WRTC 5 + C! ( MONTH YEAR C@ 10 / 16 * YEAR C@ DUP 10 / 10 * - + WRTC 6 + C! WRTC 7 + 4 000 FILL ( ALARM1 CLEAR WRTC 11 + 3 128 FILL ( ALARM2 1 MIN 06 WRTC 14 + C! ( CONTROL REG ALARM 2 00 WRTC 15 + C! ; : SET-CLOCK CR SET-DATE SET-TIME FORMAT-TIME IOB-ON RTC-SPI-INIT WAIT-ON SPI-ON WRTC 15 WRITE-CLOCK ( WRITE TO RTC ." DONE " CR CR SPI-OFF SPI-INIT IOB-OFF ; : PRINT-TIME BUFF 19 TYPE CR ; HEX : MAKE-TIME RTC 2+ C@ DUP 30 AND 10 / 30 + BUFF C! ( HOURS 0F AND 30 + BUFF 1+ C! 3A BUFF 2+ C! ( COLON RTC 1+ C@ DUP 70 AND 10 / 30 + BUFF 3 + C! ( MINUTES 0F AND 30 + BUFF 4 + C! 3A BUFF 5 + C! ( COLON RTC C@ DUP 70 AND 10 / 30 + BUFF 6 + C! ( SECONDS 0F AND 30 + BUFF 7 + C! 20 BUFF 8 + C! ( SPACE RTC 5 + C@ DUP 10 AND 10 / 30 + BUFF 9 + C! ( MONTH 0F AND 30 + BUFF A + C! 2F BUFF B + C! ( SLASH RTC 4 + C@ DUP 30 AND 10 / 30 + BUFF C + C! ( DAY 0F AND 30 + BUFF D + C! 2F BUFF E + C! ( SLASH 3230 BUFF F + ! ( 20 RTC 6 + C@ DUP F0 AND 10 / 30 + BUFF 11 + C! ( YEAR 0F AND 30 + BUFF 12 + C! ; DECIMAL : GET-TIME RTC-SPI-INIT 100 0 DO I DROP LOOP SPI-ON READ-CLOCK SPI-INIT SPI-OFF MAKE-TIME PRINT-TIME ; HEX CODE-SUB CLEAR-CLOCK 3B C, ( PSHD ; SAVE D REGISTER 34 C, ( PSHX ; SAVE X REGISTER ( THIS IS RTC-SPI-INIT CODE 4CD6 , 80 C, ( BSET PORTS,#$80 ; SET SS LINE HIGH 180B , E0 C, DDRS , ( MOVB #$E0,DDRS ; CONFIGURE PORT S DDR 180B , 02 C, SPOBR , ( MOVB #$02,SPOBR ; SET SCLK RATE = 1 MHZ 180B , 16 C, SPOCR1 , ( MOVB #$16,SPOCR1 ; MSTR=1, CPOL=0 CPHA=1 180B , 08 C, SPOCR2 , ( MOVB #$08,SPOCR2 ; SPI 2 OUTPUTS, ACTIVE PULLUPS 96D3 , ( LDAA SPOSR ; 1ST STEP TO CLEAR SPIF FLAG 96D5 , ( LDAA SPODR ; 2ND STEP TO CLEAR SPIF FLAG 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; SPI-ON ( TURN ON IOB POWER AND SET \RTC BIT 86DB , ( LDAA #$DB ; ASSERT \RTC 5A56 , ( STAA PORTP ; FREEZE RTC REGISTERS ( DELAY: CE C, 1000 , ( LDX #$7FF0 ; LOAD COUNTER 09 C, ( DEX ; DECREMENT TO ZERO 26FD , ( BNE DELAY ( CLEAR: ROUTINE TO READ RTC CONTROL REG, CLEAR ALARM2 INT BIT ( START BY SENDING READ ADDRESS OF REGISTER TO RTC 860F , ( LDAA #$0F ; READ ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 8600 , ( LDAA #00 5AD5 , ( STAA SPODR ; WRITE TO SPI 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT TILL SENT 96D5 , ( LDAA SPODR ; GET CONTROL REGISTER DATA 8404 , ( BITA #04 ; IS BIT 2 SET => BUSY? 26E8 , ( BNE CLEAR ; READ AGAIN UNTIL CLEAR 86DF , ( LDAA #$DF ; DE-ASSERT \RTC 5A56 , ( STAA PORTP ; FREEZE RTC REGISTERS ( DELAY: CE C, 0100 , ( LDX #$0100 ; LOAD COUNTER 09 C, ( DEX ; DECREMENT TO ZERO 26FD , ( BNE DELAY 86DB , ( LDAA #$DB ; ASSERT \RTC 5A56 , ( STAA PORTP ; FREEZE RTC REGISTERS 868F , ( LDAA #$8F ; WRITE ADDRESS 5AD5 , ( STAA SPODR ; SEND TO RTC 4FD3 , 80FC , ( BRCLR SPOSR #$80,* ; WAIT TILL GONE 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 86B0 , ( LDAA #$B0 5AD5 , ( STAA SPODR ; WRITE TO SPI 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT TILL SENT 96D5 , ( LDAA SPODR ; CLEAR DATA FLAG 8603 , ( LDAA #$03 5A56 , ( STAA PORTP ; DE-ASSERT \RTC 4DD0 , 40 C, ( BCLR SPOCR1,#$40 ; SPI-OFF 30 C, ( PULX ; RECOVER REGISTERS 3A C, ( PULD 3D C, ( RTS ; RETURN END-CODE ( SUBROUTINE TO ENTER STOP MODE; EXITS WITH IRQ FROM RTC CODE-SUB STOP 107F , ( ANDCC #%01111111 ; ENABLE STOP MODE 10EF , ( CLI ; ENABLE IRQ INTERRUPT 183E , ( STOP 1410 , ( SEI ; DISABLE INTERRUPTS 3D C, ( RTS END-CODE ( SUBROUTINE TO ENTER WAIT MODE; EXITS WITH IRQ FROM RTC CODE-SUB WAIT 107F , ( ANDCC #%01111111 10EF , ( CLI 3E C, ( WAI 1410 , ( SEI 3D C, ( RTS END-CODE ( ------------------ INITIALIZATION ROUTINES ------------------------ DECIMAL : CHECK-VARNS ( - FLG ) FADR 2@ 1000. D< ( CF-RAM POINTER TOO SMALL? IF RESET-CF ( SET SECTOR POINTER 0 DATACNTR ! ( CLEAR DATA COUNTER THEN TRUE 16 0 DO MYCALS I + C@ ( READ FROM EEPROM SERNO I + C@ ( READ FROM RAM = OR ( COMPARE, OR WITH PREVIOUS TEST LOOP ; : CHECK-MONTH ( - ) ( SET MINS BETWEEN DATA SETS BY THE MONTH MONTH C@ 1- 2* RATE-ARRAY + @ DUP DATA-INT ! TIMEINT ! ; : INIT-DATASPACE ( PUT OPERATING VALUES INTO DATASPACE READ-EEPROM ( GET CAL CONSTANTS, DATA COUNTER, FADR CHECK-VARNS ( COMPARE VARNS TO EEPROM, RETURN FLAG NOT IF ." ERROR READING EEPROM " CR THEN CVER VERNO ! ( S/W VERSION # TO NVRAM NUMFREQ NUMFREQS ! ( SAVE TO DATA HEADER NUMFREQ 0 DO KHZ I 2* + @ FREQ1 I 2* + ! LOOP 100 NSAMPS ! ( SETUP 100 SAMPLES 24 NPINGS ! ( 24 PINGS/FREQUENCY 7600 PULSE ! ( SETUP 1003 USEC PULSE LENGTH 1 MODE ! CHECK-MONTH ( SET DATA INTERVAL WRITE-EEPROM ( SAVE DATA SET ; ( CLEAR ACCUMULATORS PRIOR TO PINGING : CLEAR-ALL ALEN 4 / 0 DO 0. I 4 * ACC1 + 2! 0. I 4 * ACC2 + 2! 0. I 4 * ACC3 + 2! 0. I 4 * ACC4 + 2! 0. I 4 * ACC5 + 2! 0. I 4 * ACC6 + 2! LOOP ; : SET-CH ( CH# - ) ( CH = 0,1,2,...,5 10 * FREQS + ( POINT AT FREQS DATA ROW SEND-FREQS ( SETUP MUX, GAINS, & DDS SET-XMIT-FREQ ( SET TO XMIT FREQ ; ( ROUTINE TO GET ALL DATA IN SOUNDER MODE ( IOB & SPI ON BEFORE CALLED : GET-DATA ( - ) CLEAR-ALL ( ZERO THE DATA ACCUMULATORS SPI-INIT ( SETUP SPI FOR ADC/DAC 0 SET-CH TAPSTR ( DUMMY PING NPINGS @ 0 DO ( LOOP OVER PINGS NUMFREQ 0 DO ( PING ONCE ON CHANNELS 1-NUMFREQ I SET-CH ( SET DDS FREQS, MUX, GAIN TAPSTR ( PING & TAKE DATA I ALEN * ACC1 + ( POINT AT ITH ACCUMULATOR MAC ( SUM ECHO DATA INTO ACCUMULATOR 15000 0 DO I DROP ( INTER-PING DELAY LOOP LOOP ( LOOP OVER CHANNELS LOOP ( LOOP OVER PINGS ; : DO-SNDR CR ." BATTERY: " IOB-ON WAIT-TEST ( TURN ON IOB POWER SPI-INIT SPI-ON DV ( READ VOLTS, STORE IN VBAT CR ." TAKING DATA AT " GET-TIME ( STORE TIME DATA FRAME BEGINS TRANS-ON ( TURN ON BOARDS 1 DMODE ! ( SIGNAL DATA FILE WAIT-ON ( LET POWER STABILIZE GET-DATA ( INIT SPI BUS AND GET A DATA SET TRANS-OFF ( TURN BOARDS OFF SAVE-DATA ( WRITE DATA TO CF-RAM SPI-OFF IOB-OFF ( TURN IOB OFF ; ( ------------------------------------------------------------------------- : DISP-FREQS ." FREQUENCIES: " NUMFREQ 0 DO FREQ1 I 2* + @ . 2 SPACES LOOP ." KHZ" CR ; ( OUTPUT SOUNDER DATA AS ASCII-HEX DECIMAL ( ------------------- DISPLAY STATUS/VERSION -------------------- : DISP-TIMEINTS ." DATA INTERVALS BY MONTH: " 12 0 DO RATE-ARRAY I 2* + @ . 1 SPACES LOOP CR ; : UD. ( D - ) ( PRINT UNSIGNED DOUBLE <# #S #> TYPE ; : DISP-STATUS ( - ) CR CR DECIMAL ." NOAA TAPS6-NG ACOUSTIC PROFILING SYSTEM" CR ." S/N " SERNO @ U. CR ." S/W VERSION " VERNO @ S>D D>F HUNDRED F/ 2 PLACES F. CR CR ." NUMBER OF DATA SETS STORED = " DATACNTR @ . CR ." NUMBER OF BLOCKS/DATA SET = " NUMBLOCKS . CR HEX ." CF-RAM SECTOR POINTER = $" FADR 2@ D. CR DECIMAL ." MINUTES BETWEEN DATA SETS = " DATA-INT @ . CR ." NUMBER OF PINGS/DATA SET = " NPINGS @ . CR ." NUMBER OF FREQUENCIES = " NUMFREQS @ . CR ." NUMBER OF RANGE BINS = " NBINS DUP . CR 375 * ." MAX RANGE = " OUT3DIGIT CR ." CURRENT TIME & DATE = " IOB-ON SPI-ON GET-TIME SPI-ON WAIT-TEST ." CURRENT BATTERY VOLTAGE = " DV ." VDC" CR SPI-OFF IOB-OFF ." CURRENT MODE = " RUNMODE @ IF ." RUN" ELSE ." PAUSE " THEN CR DISP-FREQS CR DISP-TIMEINTS CR ; ( -------------------- REPROGRAM PARMS -------------------------- DECIMAL : ?REPROG CR ." CHANGE DATA INTERVALS (Y/N)? " KEY DUP EMIT CR YES? IF 12 0 DO ." MONTH # " I 1+ . ." : TIME INTERVAL = " GET-DAT RATE-ARRAY I 2* + SAVENUM LOOP ." THESE CHANGES ARE TEMPORARY, RECYCLE POWER FOR OLD VALUES" CR THEN CHECK-MONTH ( SET CURRENT DATA INTERVAL DISP-STATUS ( & SHOW NEW SETUP ; : DOKEY ( ASCII - ) DUP STAT = IF ( STATUS COMMAND? DISP-STATUS THEN DUP PROG = IF ( PROGRAM COMMAND? ?REPROG THEN DUP DUMPDAT = IF ( RESPOND COMMAND? DUMP-DATA THEN DUP XTRA = IF DO-SNDR THEN DUP FORCE-DUMP = IF SET-DATACNTR DUMP-DATA THEN DUP ERASEDAT = IF ERASE-RAM THEN DUP SHOWFREQS = IF DISP-FREQS THEN DUP RUN = IF TRUE RUNMODE ! ." RUN MODE SET " CR THEN DUP PAUSE = IF FALSE RUNMODE ! ." PAUSE MODE SET " CR THEN DUP VOLTS = IF ( BATTERY VOLTAGE COMMAND? GET-VOLTS THEN DUP CLOCK = IF ( TIME COMMAND? IOB-ON 10 DO I DROP LOOP GET-TIME IOB-OFF CR THEN DUP RESET-CLOCK = IF ( SET-CLOCK COMMAND? SET-CLOCK THEN KILL = IF ." DO YOU REALLY WANT TO EXIT THIS PROGRAM (Y/N)? " KEY DUP . CR YES? IF TRUE KILLME ! THEN THEN ; DECIMAL : KEY-FIX ( ASCII - ASCII' ) DUP 123 > IF DROP 0 THEN DUP 96 > ( LC LETTER? IF 97 - 65 + THEN ( SHIFT TO UC ; : INPUT? ?TERMINAL IF KEY KEY-FIX ( READ KEY, ALLOW ONLY CERTAIN ONES DOKEY ( EXECUTE COMMAND THEN ; HEX : INIT EXRAM ( HOPEFULLY REDUNDANT 001A 00C0 ! ( SET BAUD RATE TO 19200 E0 INTCR C! ( SET EDGE-SENSITIVE IRQ 02 PORTP C! ( SET CPU PERIPHERAL POWER OFF 00 PDLC C! ( SET EXTERNAL POWER OFF 00 PORTT C! ( SET MUX TO CH 0, GAIN TO 0 FF DDRP C! ( SET PORT P DDR FF DDRDLC C! ( SET PORT DLC DDR FC DDRT C! ( SET PORT T DDR; BITS 0-1 ARE INPUTS FC TIOS C! ( SET PORT T TIOS SAME TSCR C@ 80 AND TSCR C! ( SET TEN BIT OF TSCR, START TIMER 01 TIOS C! ( SET OUTPUT COMPARE TIMER 1 TRANS-OFF ( DISABLE EXT POWER RTC-SPI-INIT ( SETUP SPI BUS FOR RTC SPI-ON IOB-ON CLEAR-CLOCK IOB-OFF SPI-OFF ( AND TURN IT OFF FOR NOW WAIT-ON ( SHORT DELAY 1DB0 PULSE ! ( SETUP 503 USEC PULSE LENGTH 064 NSAMPS ! ( SETUP 100 SAMPLES 1 MODE ! ( SIGNAL SOUNDER MODE FALSE KILLME ! ( PRESET EXIT COMMAND TRUE RUNMODE ! ( START IN RUN MODE INIT-DATASPACE ( READ EEPROM DATA 2 PLACES DECIMAL ; DECIMAL ( MAIN LOOP: SET CLOCK TO 1 MIN INTERRUPTS & GO TO SLEEP ( UPON INTERRUPT, CHECKS FOR INPUT THEN CHECKS IF TIME TO RUN ( ELSE, BACK TO SLEEP : STARTUP CR ." IF THIS SETUP IS INCORRECT, PLEASE REPROGRAM NOW " CR ." YOU HAVE 2 MINUTES TO TALK TO ME " CR 2500 DOWNCOUNTER ! BEGIN WAIT-TEST INPUT? RUNMODE @ NOT IF 2500 DOWNCOUNTER ! THEN ( ENDLESS IF T DOWNCOUNTER @ 1 - DUP DOWNCOUNTER ! 0 = ( COUNT = 0? KILLME @ OR ( OR KILLME = T? UNTIL CR ; DECIMAL : COUNT-DOWN ( - ) ( COUNT DOWN CLEAR-CLOCK DATA-INT @ 0 DO IOB-OFF SPI-OFF TRANS-OFF 00 TSCR C! ( STOP TIMER WAIT CLEAR-CLOCK I . SPACE WAIT-TEST LOOP ; : SOUNDER BEGIN ( OUTER ENDLESS LOOP INPUT? ( READ & EXECUTE ANY INPUTS COUNT-DOWN ( GO TO SLEEP UNTIL TIME TO RUN DO-SNDR ( TAKE DATA AND MOVE TO CF-RAM CARD CHECK-MONTH ( CHANGE DATA INTERVAL? KILLME @ ( EXIT CODE COMMANDED? UNTIL ; : MAIN ( - ) INIT IOB-ON SPI-ON WAIT-TEST GET-TIME ( READ THE RTC SPI-OFF IOB-OFF CHECK-MONTH ( SET THE DATA INTERVAL DISP-STATUS STARTUP ( WAIT A BIT FOR KEYBOARD INPUT KILLME @ NOT IF SOUNDER ( START COLLECTING DATA THEN ." PROGRAM ENDED, BACK TO MAXFORTH " CR ; ' MAIN CFA PRGM-ADRS ! ( PUT EXECUTION ADR AT $1000 DECIMAL 24 NPINGS ! 6 NUMFREQS ! 2.928E-3 VBATSF F! 01 SERNO ! 1 MODE ! ( NOAA6.4TH - 21 JULY 2011 ( COMPUTE CHECKSUM OVER PROGRAM SPACE AND STORE PROGRAM TO CF ( THIS PROGRAM SAVES NOAA6.4TH TO CF-RAM STARTING AT SECTOR $10 VARIABLE CHECKSUM VARIABLE LINELENGTH HEX : BYTE-CHECKSUM ( - SUM ) 0 CHECKSUM ! 4F00 3F00 DO I @ CHECKSUM +! LOOP CHECKSUM @ ; : SAVE-PROGRAM ( - ) 10. FADR 2! ( POINTER INTO CF SECTORS BYTE-CHECKSUM 1002 ! 0 LINELENGTH ! CR ." SAVING PROGRAM TO CF ... " CR 25 0 DO ( SAVE 37 SECTORS FADR 2@ D. I 200 * 1000 + DUP . 4 SPACES WRITE-CF ( WRITE-PROGRAM-SECTOR INC-SECTOR LINELENGTH 1+! LINELENGTH @ 5 = IF CR 0 LINELENGTH ! THEN LOOP CR ." DONE" CR ; INIT SAVE-PROGRAM