COLD EXRAM ( ENABLE EXTERNAL RAM HEX 3000 DP ! ( LOAD CODE INTO EXTERNAL RAM ( FILE NOAATEST.4TH -- CODE TO TEST FUNCTIONS ON TAPS-NG ( 07 SEP 2006 ( 27 FEB 2007 - FIXED PROBLEM IN ADC-TEST ( 16 APR 2007 - ADDED DDRT CALL TO SEND-FREQS ( 20 MAY 2007 - ADDED 2 TVG GAIN STEPS TO RCVR TEST ( 28 APR 2011 - MODIFIED FOR NOAA TAPS-NG ( 25 MAY 2011 - SET FOR 1 MSEC XMITS ( 08 JUN 2011 - INTERRUPTS WORKING ( 11 JUL 2011 - FIXED FREQ TABLE, XMITDDS-TEST CODE ( 03 JAN 2013 - FIXED GAIN STATEMENT IN RCVR-TEST ( RUNS FROM RAM ( 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 EXTERNAL INSTRUMENTS : IS CONSTANT ; HEX 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 ( -------------------------- CONSTANTS ------------------------------- 001E IS INTCR ( INTERRUPT CONTROL REGISTER 006F IS PORTAD ( ON-BOARD ADC DATA REGISTER 0056 IS PORTP ( PORT P DATA REGISTER 0057 IS DDRP ( PORT P DATA DIRECTION 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 0080 IS TIOS ( TIMER I/O SELECT REGISTER 0084 IS TCNT ( TIMER COUNTER REGISTER 0086 IS TSCR ( TIMER SYSTEM CONTROL REGISTER 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 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 1000 IS DAC-OFF ( CODE TO SHUT DAC DOWN 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 DECIMAL -1 CONSTANT TRUE 0 CONSTANT FALSE 1E6 FCONSTANT TCLOCK ( TIMER CLOCK RATE IN HZ ( ------------------------- VARIABLES ------------------------------- VARIABLE NSAMPS ( HOLDS # OF ADC SAMPLES / PING VARIABLE PULSE ( HOLDS TIMER VALUE FOR PULSE LENGTH VARIABLE SCNTR ( SAMPLE COUNTER USED BY TAPSTR ROUTINE VARIABLE CNTR VARIABLE SOURCE ( USED IN WRITE-PROGRAM CODE VARIABLE FLAG VARIABLE ERRORCOUNT ( HOLDS # OF ERRORS IN COMPARE 2VARIABLE FADR ( LONG ADDRESS OF SECTOR IN FLASH 2VARIABLE TEMPADR ( HOLD STARTING FLASH ADDRESS ( RTC REGISTER ADDRESSES FOR READ AND WRITE VARIABLE HOUR VARIABLE MINUTE VARIABLE SECOND VARIABLE YEAR VARIABLE MONTH VARIABLE DAY VARIABLE NUM1 VARIABLE NUM2 VARIABLE NUM3 CREATE RTC ( ROOM FOR RTC DATA 20 ALLOT CREATE WRTC ( DATA TO WRITE TO RTC 20 ALLOT CREATE BUFF 100 ALLOT ( TEXT INPUT BUFFER CREATE BUFFER 512 ALLOT ( COMPACT FLASH SECTOR BUFFER CREATE DATA 640 ALLOT ( ROOM FOR 640 DATA SAMPLES ( ------------------ 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 8000 , 0083 , 126F , 006F , 6944 , ( 50 KHZ FREQS + 0 8400 , 00CC , 78EA , 0094 , 1C82 , ( 78 KHZ FREQS + 10 8000 , 012D , 7732 , 00C4 , 9BA6 , ( 115 KHZ FREQS + 20 8400 , 020C , 49BA , 0134 , 04EA , ( 200 KHZ FREQS + 30 8000 , 044D , 013B , 0254 , 60AA , ( 420 KHZ FREQS + 40 8400 , 0786 , C227 , 03F1 , 4120 , ( 735 KHZ FREQS + 50 ( COMPANION TABLE OF XMIT FREQS IN KHZ DECIMAL CREATE KHZ 50 , 78 , 115 , 200 , 420 , 735 , ( ---------------------------- 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 , ( ------------------------- MUMOD CODE ------------------------------- ( DIVIDES UNSIGNED DOUBLE BY UNSIGNED SINGLE ( OUTPUTS DOUBLE UNSIGNED QUOTIENT AND SINGLE REMAINDER CODE-SUB MUMOD ( UD UN -- UREM UDQUOTIENT ) 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 ( ---------------------- SPI INIT SUBROUTINE ----------------------------- 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 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 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 CODE-SUB SPI-ON 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI 3D C, END-CODE CODE-SUB SPI-OFF 4DD0 , 40 C, ( BCLR SPOCR1,#$40 ; DISABLE SPI 3D C, END-CODE ( ---------------------- UTILITY ROUTINES --------------------------------- CODE-SUB POWER-ON 4CFE , 40 C, ( BSET PDLC,#$40 ; ENABLE EXTERNAL POWER 3D C, ( RTS END-CODE CODE-SUB POWER-OFF 4DFE , 40 C, ( BCLR PDLC,#$40 ; DISABLE EXTERNAL POWER 3D C, ( RTS END-CODE CODE-SUB IOB-ON 180B , DD C, PORTP , ( MOVB #$FD,PORTP ; POWER ON, BITS = 1 3D C, ( RTS END-CODE CODE-SUB IOB-OFF 180B , 03 C, PORTP , ( MOVB #$0A,PORTP ; POWER OFF, BITS = 0 3D C, ( RTS 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 ( --------------------------------------------------------- ( 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 ( ( PREFIX TABLE ENDS WITH $00, USED TO END LOOP ( FREQS TABLE IS VERY LONG, START POINT SENT TO ( SUBROUTINE VIA STACK BY CALLING WORD ( LAYOUT IS TTDD FFFF FFFF LLLL LLLL ( WHERE TT IS THE CHAN/MUX CODE FOR PORT-T ( DD IS THE GAIN CODE FOR PORT-DLC ( 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 ( -------------------- TVG DAC SEND ROUTINE --------------------------- ( ( SENDS 16-BIT VALUE ON STACK TO THE 8-BIT DAC CODE-SUB DAC 3B C, ( PSHD ; SAVE D ACCUMULATOR EC40 , ( LDD 0,Y ; READ DAC VALUE FROM STACK 02 C, ( INY 02 C, ( INY ; ADJUST STACK POINTER 4CD0 , 40 C, ( BSET SPOCR1,#$40 ; ENABLE SPI ( ACTUALLY SEND THE TWO BYTES HERE 4D56 , 10 C, ( BCLR PORTP,#$10 ; ASSERT \DAC 5AD5 , ( STAA SPODR ; SEND MSB TO DAC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR TRANSMIT COMPLETE 96D5 , ( LDAA SPODR ; CLEAR DATA REGISTER 5BD5 , ( STAB SPODR ; SEND LSB TO DAC 4FD3 , 80FC , ( BRCLR SPOSR,#$80,* ; WAIT FOR TRANSMIT COMPLETE D6D5 , ( LDAB SPODR ; CLEAR DATA REGISTER 4C56 , 10 C, ( BSET PORTP,#$10 ; DE-ASSERT \DAC 3A C, ( PULD ; RESTORE ACCUMULATOR 3D C, ( RTS 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 ( THIS CODE COPIES THE RAM CODE IMAGE TO CF; CALL WITH THE ( STARTING ADDRESS OF THE SOURCE DATA ON THE STACK CODE-SUB WRITE-PROGRAM-SECTOR ( MAIN: 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 ; 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 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, 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 DECIMAL : INC-SECTOR FADR 2@ 1. D+ FADR 2! ; HEX 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 ( ; 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, 0010 , ( LDY #16 ; SETUP COUNTER TO READ 16 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 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 ( --------------------- FORTH CODE ---------------------------------- DECIMAL : BS 20 0 DO 08 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-ON 20000 0 DO 3 0 DO I DROP LOOP LOOP ; : DISP-STATUS CR ." NOAA TAPS6 NG " CR ." CONTROLLER TEST CODE V1.0" CR CR ; ( ----------------------- TEST ROUTINES --------------------------------- : TVG-TEST IOB-ON SPI-ON CR ." PRESS TO STEP TO NEXT LEVEL " CR 0 16 * DAC ." TVG OUTPUT = 0 V " KEY EMIT 64 16 * DAC ." TVG OUTPUT = 0.25 V " KEY EMIT 128 16 * DAC ." TVG OUTPUT = 0.5 V " KEY EMIT 192 16 * DAC ." TVG OUTPUT = 0.75 V " KEY EMIT 255 16 * DAC ." TVG OUTPUT = 1.0 V " KEY EMIT ." TVG SWEEP: PRESS ANY KEY TO STOP " BEGIN 255 0 DO I 16 * DAC LOOP ?TERMINAL UNTIL KEY DROP CR 768 16 * DAC ." DAC SHUT DOWN " CR ; ( call with channels 1-6 : SET-CH ( CH# - ) 1- 10 * FREQS + ( POINT AT FREQS DATA ROW SEND-FREQS ( SETUP MUX, GAINS, & DDS SET-XMIT-FREQ ( SET TO XMIT FREQ ; : BUFF-INIT BUFF 16 BLANK ; : GET-STRING BUFF-INIT BUFF 16 EXPECT ; 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 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 ; : XMITDDS-TEST POWER-ON IOB-ON SPI-INIT SPI-ON WAIT-ON CR ." TRANSMIT/DDS TEST, ENTER CHANNEL # (1-6) : " KEY DUP 49 MAX 54 MIN EMIT CR 49 - ( CONVERT TO 0-5 RANGE ." FREQUENCY = " DUP 2* KHZ + @ . ." KHZ" CR 1 + SET-CH ( SET DDS/MUX/GAIN ." XMIT FREQUENCY CHECK; PRESS ANY KEY TO CONTINUE" KEY EMIT CR SET-LO-FREQ ." LO FREQUENCY CHECK; PRESS ANY KEY TO CONTINUE" KEY EMIT CR ." SET PULSE LENGTH (Y/N)? " KEY DUP EMIT CR 89 = IF PULSE @ ." PULSE CODE = " . CR ." ENTER NEW VALUE: " GET-DAT PULSE SAVENUM THEN ." PULSED OPERATION CHECK; PRESS ANY KEY TO END" BEGIN ( TRANSMIT GATE TEST TAPSTR ( PING & DIGITIZE DATA 15000 0 DO I DROP LOOP ?TERMINAL UNTIL KEY DROP ." DONE " CR ; : RCVR-TEST POWER-ON IOB-ON SPI-ON WAIT-ON CR ." RECEIVER TEST, ENTER CHANNEL # : " KEY DUP 49 MAX 54 MIN EMIT CR 49 - ( CONVERT TO 0-5 RANGE ." FREQUENCY = " DUP 2* KHZ + @ . ( PRINT FREQUENCY ." KHZ" CR DUP 10 * FREQS + C@ ( FIND LINE IN FREQS TABLE PORTT C! ( SET MUX/GAIN CODES 1 + SET-CH ( SET DDS TO CHAN FREQ ." GAIN SET FOR 1M RANGE " CR ." POST-IF GAIN = 16X " CR SET-LO-FREQ ." ENABLE T/R SWITCH WITH JUMPER NOW " CR 1056 DAC ( SET TVG FOR 1M RANGE ." REMOVE T/R JUMPER WHEN DONE AND PRESS ANY KEY " KEY DROP CR ; : WAIT-TEST 1000 0 DO I DROP LOOP ; : ADC-TEST IOB-ON SPI-INIT SPI-ON WAIT-ON CR ." TESTING ADC ... " CR ." ENTER CHANNEL # [0-3]: " KEY 48 MAX 51 MIN ( SCALE TO RANGE DUP EMIT CR 48 - ( CONVERT TO NUMBER 32 * 256 * ( SCALE, MOVE TO HI BYTE, SAVE ." ADC CODE VALUE -- PRESS ANY KEY TO END " CR DUP TAPSADC ( DUMMY READ BEGIN DUP TAPSADC ( READ 16 SAMPLES FROM CH X 0. 16 0 DO I 2* DATA + @ ( GET A VALUE 0 D+ ( MAKE DOUBLE & ADD TO SUM LOOP 16 MUMOD ( NORMALIZE, CONVERT TO MV BS 6 D.R DROP ( FORMATTED OUTPUT 20000 0 DO I DROP LOOP ?TERMINAL UNTIL DROP KEY DROP CR SPI-OFF IOB-OFF ; ( -------------------------- RTC ROUTINES ---------------------- : BCD2INT ( BCD - INT ) 16 /MOD 10 * + ; : INT2BCD ( INT - BCD ) 10 /MOD 16 * + ; : 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 ; : 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 ( ALARM EVERY 1 SEC WRTC 11 + 3 128 FILL 06 WRTC 14 + C! ( CONTROL REG ALARM 2 ( 176 WRTC 15 + C! 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 CR ." RTC: " BUFF 19 TYPE CR 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! ; : SET-MINUTE-ALARM ( SET ALARM 2 FOR 1 MIN INTERVALS 0B WRTC 0A + C! ( RTC ADDRESS = $0B 80 WRTC 0B + C! 80 WRTC 0C + C! 80 WRTC 0D + C! WRTC 0A + 4 WRITE-CLOCK ; : MAKE-ALARMS RTC 0A + C@ 80 / 8 * RTC 09 + C@ 80 / 4 * + RTC 08 + C@ 80 / 2 * + RTC 07 + C@ 80 / + ." ALARM 1 CODE: " HEX . DECIMAL RTC 9 + C@ DUP 30 AND 10 / 30 + BUFF C! ( HOURS 0F AND 30 + BUFF 1+ C! 3A BUFF 2+ C! ( COLON RTC 8 + C@ DUP 70 AND 10 / 30 + BUFF 3 + C! ( MINUTES 0F AND 30 + BUFF 4 + C! 3A BUFF 5 + C! ( COLON RTC 7 + C@ DUP 70 AND 10 / 30 + BUFF 6 + C! ( SECONDS 0F AND 30 + BUFF 7 + C! 20 BUFF 8 + C! ( SPACE ." TIME: " BUFF 8 TYPE CR RTC 0D + C@ 80 / 4 * RTC 0C + C@ 80 / 2 * + RTC 0B + C@ 80 / + ." ALARM 2 CODE: " HEX . DECIMAL RTC 0C + C@ DUP 30 AND 10 / 30 + BUFF C! ( HOURS 0F AND 30 + BUFF 1+ C! 3A BUFF 2+ C! ( COLON RTC 0B + C@ DUP 70 AND 10 / 30 + BUFF 3 + C! ( MINUTES 0F AND 30 + BUFF 4 + C! 20 BUFF 8 + C! ( SPACE ." TIME: " BUFF 5 TYPE CR ; DECIMAL : RTC-TEST CR IOB-ON RTC-SPI-INIT 100 0 DO I DROP LOOP SPI-ON READ-CLOCK SPI-OFF SPI-INIT IOB-OFF MAKE-TIME PRINT-TIME MAKE-ALARMS CR CR ; 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 WAIT MODE; EXITS WITH IRQ FROM RTC ( CAN BE SETUP TO USE STOP OR WAIT COMMANDS HEX CODE-SUB WAIT 107F , ( ANDCC #%01111111 ; ENABLE STOP MODE 10EF , ( CLI ; ENABLE IRQ INTERRUPT 183E , ( STOP ( 3E C, ( WAI ; WAIT FOR IRQ 1410 , ( SEI ; DISABLE INTERRUPTS 3D C, ( RTS END-CODE : DO-INTERRUPTS ( - ) CR ." ONE MINUTE INTERRUPTS STARTED " CR ." TYPE ANY KEY TO QUIT " CR 0 CNTR ! BEGIN IOB-OFF SPI-OFF POWER-OFF 00 TSCR C! ( STOP TIMER WAIT CLEAR-CLOCK CNTR @ 1+ DUP . CR CNTR ! ?TERMINAL UNTIL KEY DROP CR ; DECIMAL : DO-CHOICE ( N - FLAG ) DUP 1 = IF XMITDDS-TEST THEN DUP 2 = IF RCVR-TEST THEN DUP 3 = IF ADC-TEST THEN DUP 4 = IF TVG-TEST THEN DUP 5 = IF RTC-TEST THEN DUP 6 = IF SET-CLOCK THEN DUP 7 = IF DO-INTERRUPTS THEN 0 = IF TRUE ELSE FALSE THEN POWER-OFF SPI-OFF IOB-OFF ; : GET-CHOICE ( - N ) CR ." CHOICE = " KEY DUP EMIT 48 - ; : DISP-MENU ." TEST MENU" CR ." NOAATEST.4TH" CR ." 0 END" CR ." 1 XMIT/DDS TEST" CR ." 2 RECEIVER TEST" CR ." 3 ADC TEST" CR ." 4 TVG TEST " CR ." 5 GET RTC " CR ." 6 SET RTC " CR ." 7 INTERRUPTS " CR CR ; 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 POWER-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 0 MODE ! ( SIGNAL TEST MODE 2 PLACES DECIMAL ; : MAIN INIT CR DISP-STATUS CR BEGIN DISP-MENU GET-CHOICE DO-CHOICE UNTIL CR SPI-OFF POWER-OFF IOB-OFF ; HEX ' MAIN CFA PRGM-ADRS ! ( PUT EXECUTION ADR AT $1000 ( NOAATEST.4TH - TAPS NG TEST CODE - 03 JAN 2013 DECIMAL 0 MODE ! ( COMPUTE CHECKSUM OVER PROGRAM SPACE AND STORE PROGRAM TO CF ( THIS PROGRAM SAVES NOAATEST.4TH TO CF-RAM STARTING AT SECTOR $60 VARIABLE CHECKSUM VARIABLE LINELENGTH HEX : BYTE-CHECKSUM ( - SUM ) 0 CHECKSUM ! 4F00 3F00 DO I @ CHECKSUM +! LOOP CHECKSUM @ ; : SAVE-PROGRAM ( - ) 50. FADR 2! ( POINTER INTO CF SECTORS BYTE-CHECKSUM 1002 ! 0 LINELENGTH ! CR ." SAVING PROGRAM TO CF ... " CR 33 0 DO FADR 2@ D. I 200 * 1000 + DUP . 4 SPACES WRITE-PROGRAM-SECTOR INC-SECTOR LINELENGTH 1+! LINELENGTH @ 5 = IF CR 0 LINELENGTH ! THEN LOOP CR ." DONE" CR ; INIT SAVE-PROGRAM