TITLE RA6803.Z00 ; TITLE RA6803.Z00 ; ;MARCH 10, 1989 ;THIS PROGRAM CONTROLS THE GENERAL PURPOSE RA6830 RECEIVER WITH AN ;ASCII BASED RS232 INTERFACE. IT IS FUNCTIONALLY EQUIVALENT TO ;THE RA6801.Z01 PROGRAM, WITH ENHANCEMENTS INCLUDING ISB ;AND BASEBAND CONVERTER BOARD POSSIBLE OPTIONS, BFO DISPLAY ;SIMULTANEOUS WITH CW DETECTOR, AND BETTER STRUCTURE WITH MASSIVE ;SECTIONS REWRITTEN. BASED ON RE6809.Z00, WITH THE RS232 ROUTINES ;FROM RAGM00.Z00. ; SECTION PROGRAM START DI ;KILL INTERRUPTS JP INIT ;GO INITIALIZE THE RECEIVER VERMSG DEFB ' ' DEFB '1600188 Z00' ; DEFB '1989' ORG 38H ;THIS IS THE INTERRUPT HANDLER ; INTRPT EX AF,AF' ;SAVE THE MAIN PROGRAM REGISTERS EXX IN A,(2) ;FIND OUT WHO INTERRUPTED BIT 2,A JP NZ,RXINT ;BRANCH IF UART RX INTERRUPT BIT 1,A ;BRANCH IF UART TX INTERRUPT JR NZ,TXINT ; ; ;THIS IS THE CLOCK INTERRUPT ROUTINE ; CLKINT LD A,4 ;RESET THE CLOCK TIMER OUT (6),A SUB A OUT (6),A LD HL,T25MS ;TEST AND DECREMENT (AS NEEDED) THE 25 MS LD B,3 ; TIMER (T25MS) ,BITE TIMER AND THE OUT OF SUB A ; LOCK TIMER (OOLTMR) 5$ CP (HL) ;TEST HERE IF VALUE IS 0 JR Z,10$ ;BRANCH IF YES DEC (HL) ;ELSE DECREMENT VALUE 10$ INC HL ;POINT TO NEXT VALUE TO TEST DJNZ 5$ ;BRANCH IF NOT DONE IN A,(2) ;CHECK ENCODER VALUE. (HL ALREADY POINTING AND 0C0H ;TO ENCDRS.) STRIP JUNK XOR (HL) ;SEE IF ENCODER VALUE CHANGED JR Z,15$ ;BRANCH IF NOT LD B,A ;ELSE SAVE BIT CHANGE XOR (HL) ;GET BACK NEW LD (HL),A ;SAVE AS OLD SLA A ;FIND DIRECTION XOR (HL) ;XOR THE BITS INC HL XOR B ;AND WITH THE BIT CHANGED AND 80H ;STRIP JUNK RLCA RLCA ADD A,(HL) ;ADD IN THE OLD DEC A ;MAKE + OR - 1 LD (HL),A ;SAVE IT 15$ LD A,(TSHORT) ;TEST THE AGC TIMER AND A JR Z,20$ ;IGNORE IF NOT RUNNING DEC A ;ELSE UPDATE IT LD (TSHORT),A JR NZ,20$ ;BRANCH IF NOT TIMED OUT LD A,(DACLVL) ;ELSE SET UP DAC OUT (2),A LD A,(PORT92) ;THEN SET UP PROPER MAIN AGC OUT (92H),A CALL TSTISB ;SET UP ISB AGC IF INSTALLED JR NZ,20$ LD A,(PORT97) OUT (97H),A 20$ LD A,(DMPTMR) ;TEST THE AGC DUMP TIMER AND A JR Z,30$ ;IGNORE IF IDLE DEC A ;ELSE UPDATE IT LD (DMPTMR),A JR NZ,30$ ;BRANCH IF NOT TIMED OUT LD A,17H ;ELSE FORCE AGC SHORT AND DUMP OUT (92H),A CALL TSTISB ;SET UP ISB AGC TO SHORT IF INSTALLED JR NZ,25$ LD A,0BH OUT (97H),A 25$ LD A,0FFH ;FORCE MAX VALUE TO AGC DAC OUT (2),A LD A,60 ;SET THE TEMP SHORT AGC TIMER LD (TSHORT),A ; FOR 30 MILLISECONDS LD A,16H ;CLEAR THE DUMP COMMAND LINE BUT KEEP OUT (92H),A ; AGC SHORT 30$ JR INTEND ;GO FINISH UP ;THIS IS THE UART TX INTERRUPT ; TXINT LD HL,OUTBUF ;GET OUTPUT POINTER SUB A ADD A,(HL) JR Z,10$ ;BRANCH IF SYSTEM INACTIVE INC (HL) ;UPDATE POINTER FOR NEXT TIME CALL ADC ;AUGMENT POINTER FOR THIS TIME LD A,(HL) ;GET DATA FOR OUTPUT CP 10 ;SEE IF NUMBER JR NC,5$ ;BRANCH IF NOT NUMBER ADD A,'0' ;ELSE MAKE NUMBER ASCII 5$ OUT (99H),A ;OUTPUT DATA CP 13 ;SEE IF DATA WAS TERMINATOR JR Z,10$ ;BRANCH IF YES CP ':' ;TEST IF BITE TERMINATOR JR NZ,INTEND ;BRANCH IF NOT 10$ SUB A ;TURN OFF OUTPUT SYSTEM LD (OUTBUF),A LD HL,PORT9D ;DISABLE UART TX INTERRUPTS RES 3,(HL) LD A,(HL) OUT (9DH),A JR INTEND ;GO FINISH UP ;THIS IS THE UART RX INTERRUPT ROUTINE ; RXINT IN A,(9BH) ;GET AND ISOLATE THE UART ERRORS AND 7 LD E,A ;SAVE ERRORS TEMP IN E REG LD HL,INBUF ;TEST IF INPUT BUFFER FULL BIT 7,(HL) JR Z,5$ ;BRANCH IF NOT SET 1,E ;ELSE SET "LOST DATA" ERROR FLAG IN A,(98H) ;THEN THROW AWAY UART INPUT DATA JR 15$ ;GO FINISH UP 5$ INC HL ;POINT TO INPUT BUFFER OUTPUT POINTER INC HL LD C,(HL) ;SAVE OUTPUT POINTER IN C REG DEC HL LD B,(HL) ;SAVE COPY OF INPUT POINTER IN B REG LD A,B INC A ;UPDATE NEW POINTER LD (HL),A ;RESTORE FOR NEXT TIME DEC HL ;POINT TO FLAG STORAGE XOR C ;COMPARE UPDATED POINTER AGAINST OUTPUT POINTER LD A,0 ;PRESET BUFFER NOT FULL FLAG JR NZ,10$ ;BRANCH IF BUFFER NOT FULL LD A,80H ;SET BUFFER FULL FLAG 10$ LD (HL),A ;SET BUFFER FLAG IN STORAGE LD HL,INBUF+3 ;PREPARE TO SAVE NEW DATA LD A,B ;GET OLD INPUT POINTER FOR THIS BYTE CALL ADC ;AUGMENT TO CORRECT STORAGE IN A,(98H) ;GET DATA FROM UART AND 7FH ;MAKE ASCII LD (HL),A ;SAVE IN INBUF 15$ LD HL,RXSTAT+2 ;TEST UART ERRORS BIT 1,E ;ANY OVERRUN OR LOST DATA ERRORS ? JR Z,20$ ;BRANCH IF NOT SET 5,(HL) ;ELSE SET ERROR BIT IN RX STATUS WORD 20$ LD A,5 ;TEST FRAMING AND PARITY ERRORS AND E JR Z,INTEND ;BRANCH IF NONE SET 3,(HL) ;ELSE SET ERROR FLAG ; ; INTEND EXX ;RESET MAIN PROGRAM VARIABLES EX AF,AF' EI ;RE-ENABLE INTERRUPTS RETI ;RETURN TO MAIN PROGRAM ;THIS IS THE RECEIVER INITIALIZATION ROUTINE ; INIT IM 1 ;SET INTERRUPT MODE 1 (RST 38H MODE) LD SP,STACK ;SET UP THE STACK POINTER IN A,(0) ;TEST PANIC BUTTON, AND FORCE DEFAULT SETUP BIT 5,A ; IF ACTIVE (ENTER AND 7) JR NZ,5$ IN A,(1) BIT 0,A JR Z,10$ 5$ LD A,(RAMCPT) ;SET UP RAM DEFAULTS IF RAM CORRUPTED CP 55H JR Z,15$ 10$ LD HL,DEFLT LD DE,FILTER LD BC,65 LDIR 15$ LD HL,RXSTAT ;KEEP METER CONTROL BIT AND ZERO REST OF LD A,40H ; RECEIVER STATUS WORDS AND (HL) LD (HL),A INC HL ;ZERO THE REST OF RAM INITIALLY LD BC,STACK-RXSTAT 20$ LD (HL),0 INC HL DEC BC LD A,B OR C JR NZ,20$ CALL BWTAB ;SET UP THE IFTRAN TABLE LD A,(DETECT) ;TEST DETECTOR FOR ISB AND A JR Z,25$ ;BRANCH IF ISB CP 5 JR NZ,30$ 25$ CALL TSTISB ;ISB DETECTOR-- TEST IF ISB INSTALLED JR Z,30$ ;BRANCH IF YES, OK LD A,1 ;ELSE ERROR-- FORCE AM DETECTOR LD (DETECT),A 30$ IN A,(2) ;CLEAN UP THE ENCODER SAMPLE STORAGE AND 0C0H LD (ENCDRS),A IN A,(95H) ;BRANCH IF BASEBAND CONVERTER NOT INSTALLED BIT 6,A JR NZ,40$ LD HL,LO3TBL ;POINT TO 3RD LO SET-UP TABLE LD E,8 ;PREPARE TO OUTPUT 8 BYTES 35$ LD A,(HL) ;GET TABLE ENTRY CALL LD3LO ;OUTPUT IT SERIALLY TO 3RD LO INC HL ;UPDATE POINTER DEC E ;UPDATE COUNTER JR NZ,35$ ;BACK IF MORE TO DO 40$ LD A,7DH ;KILL BITE SIG GEN (SETRCR SETS UP H/W LATER) LD (PORT96),A LD A,(PORT94) ;SET UP THE FREQUENCY REFERENCE OUT (94H),A LD A,4 ;RESET THE CLOCK TIMER OUT (6),A SUB A OUT (6),A LD A,8 ;SET INBUF EMPTY FLAG LD (INBUF),A IN A,(9CH) ;FORCE UART CONFIGURATION UPDATE CPL LD (URTCFG),A CALL SETURT CALL SETRCR ;SET UP THE RECEIVER AND DISPLAYS CALL SETDSP LD HL,0 ;DELAY, ALLOW THE SYNTHESIZER TO POWER UP LD DE,1 45$ SBC HL,DE JR NZ,45$ CALL SETFRQ ;SET UP THE SYNTHESIZER AGAIN TO HELP LOCK LD A,55H ;UNCORRUPT RAM LD (RAMCPT),A IN A,(98H) ;PURGE UART INPUT BUFFER LD HL,PORT9D ;ENABLE UART RX INTERRUPTS SET 6,(HL) LD A,(HL) OUT (9DH),A ;THE FOLLOWING IS THE INPUT SYSTEM DISPATCHER. NEW CHARACTERS ARE RETURNED ;IN THE C REG AS WELL AS IN THE ACCUMULATOR. ; INPUT CALL G1CR ;GET NEW INPUT CHARACTER ; INPRTN LD A,C ;TEST NEW CHARACTER CP '$' ;BRANCH IF UNLISTEN COMMAND (ALWAYS JR Z,5$ ; READY TO UNLISTEN) LD HL,TLKREQ ;ALL ELSE MUST BE APPROVED BY LISTEN BIT 5,(HL) ; ENABLE BIT JR Z,INPUT 5$ LD HL,COMLET ;TEST IF NEW CHARACTER IS IN TABLE 10$ SUB A ;TEST TABLE ENTRY ADD A,(HL) JR Z,INPUT ;GO AFTER NEXT CHARACTER IF END OF TABLE CP C ;TEST THIS CHARACTER AGAINST TABLE ENTRY JR Z,15$ ;BRANCH IF MATCH INC HL ;ELSE TEST NEXT TABLE ENTRY INC HL INC HL JR 10$ 15$ INC HL ;GET ROUTINE ADDRESS FROM TABLE TO HL LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) ;VECTOR TO ROUTINE ;BACKGROUND ROUTINE TO HANDLE INPUT FROM THE FRONT PANEL ENCODER WHEEL ; BAKGND LD HL,ENCDRA ;POINT TO ENCODER ACCUMULATOR SUB A ;CLEAR THE CPU ACCUMULATOR DI ;INTERRUPTS NOT PERMITTED LD C,(HL) ;MOVE ACCUMULATOR CONTENTS TEMP TO C REG. LD (HL),A ;THEN CLEAR ACCUMULATOR EI ;RE-ENABLE INTERRUPTS ADD A,C ;TEST DATA JP Z,SAMPNT ;BRANCH IF NOTHING TO DO LD HL,RXSTAT ;MONITOR MODE ? BIT 7,(HL) JR NZ,ENCMON ;BRANCH IF YES BIT 0,(HL) ;REMOTE ? JP NZ,SAMPNT ;BRANCH OUT IF SO LD A,(MODEWD) ;BRANCH AND IGNORE FREQ TUNING IF NOT FREQ MODE CP 5 JR NZ,BFOTUN LD A,(TUNCTR) ;TEST TUNE CONTROL AND 0FH CP 4 JR Z,SAMPNT ;BRANCH OUT IF LOCKED LD B,A ;ELSE UPDATE FREQ (SAVE TUNE CONTROL IN B REG) SUB A ;KILL FRQPTR WHILE HERE LD (FRQPTR),A CALL BINDEC ;CONVERT NUMBER TO BCD CALL FRQLD ;CALL FREQ ADD ROUTINE DEC HL ;POINT BACK TO MSD'S LD A,(HL) ;TEST MSD'S BIT 7,A ;SEE IF MSD'S ARE POSITIVE JR Z,5$ ;BRANCH IF YES LD (HL),31H ;ELSE LOAD MAX LIMIT (31.999999 MHZ) LD A,99H JR 10$ 5$ CP 32H ;SEE IF OVER LIMIT (31.999999 MHZ) JR C,15$ ;BRANCH IF NOT SUB A ;ELSE SET LOWER LIMIT (0 MHZ) LD (HL),A 10$ DEC HL LD (HL),A DEC HL LD (HL),A DEC HL LD (HL),A 15$ LD HL,FRQWRK ;RESET POINTER LD A,2 ;TEST TUNE RATE CP B JR Z,20$ ;BRANCH IF SLOW JR NC,25$ ;BRANCH FOR FINE SUB A ;ELSE FAST LD (HL),A ;CLEAR LSD'S JR 25$ 20$ LD A,(HL) ;CLEAR 1 HZ DIGIT FOR SLOW, 100HZ FOR FAST AND 0F0H LD (HL),A ;RESTORE DIGIT 25$ CALL SETUP ;SET UP MAIN LO AND DISPLAYS CALL SETF1 CALL SETDSP JR SAMPNT ;DONE ;THIS ROUTINE UPDATES THE BFO VIA THE ENCODER WHEEL ; BFOTUN LD A,(MODEWD) ;DO NOT UPDATE BFO UNLESS CW VARIABLE MODE CP 6 ; ACTIVE JR NZ,SAMPNT LD A,(DETECT) ;TEST IF CW VARIABLE MODE CP 3 JR NZ,SAMPNT ;BRANCH IF NOT LD A,(TUNCTR) ;BRANCH IF BFO TUNING LOCKED BIT 6,A JR NZ,SAMPNT CALL BINDEC ;CONVERT NEW ENCODER DATA TO BCD CALL BFOLD ;ADD TO PRESENT BFO CALL SETUP ;SET UP THE BFO AND DISPLAYS CALL SETBFO CALL SETDSP JR SAMPNT ;DONE ;THIS ROUTINE UPDATES THE MONITOR DATA VIA THE ENCODER WHEEL ; ENCMON LD HL,(MONPNT) ;POINT TO DATA FOR UPDATING LD A,C ;ADD NEW DATA TO OLD ADD A,(HL) LD (HL),A LD DE,MONDAT ;TEST WHICH WORD WAS UPDATED AND A ;CLEAR THE CARRY SBC HL,DE JR NZ,5$ ;BRANCH IF ADDRESSED DATA NOT MODIFIED CALL PRMON ;ELSE DISPLAY ONLY DISPLAYED DATA, NOT MEMORY JR SAMPNT ;DONE 5$ CALL SETDSP ;DISPLAY DATA SAMPNT LD A,(T25MS) ;SEE IF 25 MS TIMER TIMED OUT YET AND A JP NZ,BAKGND ;JUMP BACK IF NOT LD A,50 ;RESET THE 25 MS TIMER LD (T25MS),A ;START THE SLOW BACKGROUND LOOP LD HL,RXSTAT+1 ;POINT TO OOL STATUS BITS LD B,0FH ;PREPARE NEW OOL MASK-- PRESET FOR ALL LD A,(OOLTMR) ;TEST OOL TIMER AND A JR Z,5$ ;BRANCH IF IDLE LD B,0AH ;ELSE MASK OUT 1ST LO AND BFO OOL'S 5$ LD A,(DETECT) ;TEST DETECTOR MODE AND A JR Z,10$ ;BRANCH IF ISB-U CP 3 ;BRANCH IF CW OR SSB JR NC,10$ RES 2,B ;MASK OUT BFO OOL FOR AM OR FM 10$ IN A,(95H) ;GET OOL HARDWARE BITS BIT 6,A ;BRANCH IF BASEBAND CONVERTER INSTALLED JR Z,15$ RES 3,B ;ELSE KILL BASEBAND OOL TEST BIT 15$ XOR 4 ;INVERT BFO BIT TO MAKE POSITIVE TRUE AND B ;KEEP ONLY RELEVANT BITS XOR (HL) ;COMPARE NEW FLAGS TO OLD AND 0FH JR Z,30$ ;BRANCH IF NO CHANGES LD B,A ;ELSE SAVE COPY OF CHANGES XOR (HL) ;UPDATE HISTORIES LD (HL),A AND B ;ISOLATE CHANGES TO NEW OOL'S ONLY JR Z,25$ ;BRANCH IF NONE, DISPLAY RECENT STATUS BIT 1,A ;BRANCH IF REFERENCE OK JR Z,25$ LD A,(PORT94) ;TEST AND SET INT OR EXT ERROR FLAGS BIT 0,A JR NZ,20$ ;BRANCH IF EXTERNAL REFERENCE OOL SET 4,(HL) ;ELSE SET INTERNAL REF LOST FLAG JR 25$ ;BRANCH TO CONTINUE 20$ SET 5,(HL) ;SET EXTERNAL REF LOST FLAG 25$ SET 7,(HL) ;UPDATE DISPLAYS 30$ LD A,0FH ;ANY LINGERING FAULTS ? AND (HL) JR Z,35$ ;BRANCH IF NOT SET 6,(HL) ;SET OOL HISTORY FLAG FOR REMOTE LD A,(TBLINK) ;UPDATE THE OOL BLINK TIMER LD B,A INC A LD (TBLINK),A XOR B ;TIME FOR DISPLAY UPDATE ? AND 10H JR Z,35$ ;BRANCH IF NOT SET 7,(HL) ;REQUEST DISPLAY UPDATE 35$ BIT 7,(HL) ;ANY NEW DATA FOR DISPLAY ? RES 7,(HL) CALL NZ,SETDSP ;DISPLAY IT IF YES LD A,(TSHORT) ;UPDATE METERS IF TSHORT IDLE AND A CALL Z,DAC ; ; LD IX,MODCNT ;POINT TO MODE REPEAT COUNTER LD HL,SWSTAT ;BRANCH IF MODE SWITCH PRESSED LAST TIME BIT 7,(HL) JR Z,40$ LD (IX),30 ;ELSE KEEP AN IDLE COUNT OF .75 SECOND JR 45$ 40$ DEC (IX) ;UPDATE COUNTER JR NZ,45$ ;BRANCH IF NOT YET ZERO LD (IX),20 ;ELSE RELOAD WITH .5 SECOND COUNT SET 7,(HL) ;THEN "UNPRESS" SWITCH TO FORCE MODE REPEAT ; ; 45$ LD HL,RXSTAT+2 ;IGNORE KEYSWITCHES TOTALLY IF REMOTE OVERRIDE BIT 2,(HL) JR NZ,FRQSCN SUB A ;ELSE TEST KEYSWITCHES NEXT LD (KEYEXC),A ;CLEAR EXECUTION REGISTER LD A,15 ;TEST 16 SWITCHES KYSWTH LD (KEYCNT),A ;UPDATE KEYSWITCH COUNTER LD HL,SWDTBL ;POINT TO THE KEYSWITCH TABLE SLA A ;MULTIPLY AUGMENT BY 4 SLA A CALL ADC ;AUGMENT POINTER LD B,(HL) ;SAVE BIT MASK IN REG B INC HL LD A,(HL) ;GET LSB OF SWITCH PORT NUMBER AND 1 ;REMOVE REMOTE EXCLUSION BIT EX DE,HL ;TEMP SAVE HL LD HL,SWSTAT ;POINT TO SWITCH STATUS CALL ADC ;AUGMENT POINTER LD C,A ;USE AS INDIRECT PORT NUMBER IN A,(C) ;GET SWITCH PORT DATA XOR (HL) ;TEST IF STATUS CHANGED AND B ;ISOLATE BIT OF INTEREST JR Z,KYSWTM ;BRANCH IF NO CHANGE XOR (HL) ;ELSE UPDATE SWITCH STATUS STORAGE LD (HL),A AND B ;DETERMINE IF SWITCH PRESSED JR NZ,KYSWTM ;IGNORE IF SWITCH RELEASED LD A,(RXSTAT) ;GET AND POSITION REMOTE BIT CALL SHFTL4 EX DE,HL ;RETRIEVE SWITCH TABLE POINTER AND (HL) ;TEST REMOTE EXCLUSION BIT IN TABLE AND 10H ;IGNORE IF REMOTE AND EXCLUSION BITS SET JR NZ,KYSWTM INC HL LD E,(HL) INC HL LD D,(HL) EX DE,HL LD C,0 ;CLEAR DEFERRED FUNCTION EXECUTION REGISTER JP (HL) ;INDIRECTLY JUMP TO KEYSWITCH ROUTINE ; ; ;THIS IS THE TERMINATION ROUTINE FOR THE SWITCH SYSTEM. ;WHEN ALL SWITCHES HAVE BEEN TESTED, ANY CLEAN UP ;THAT NEEDS TO BE DONE IS TRANSMITTED TO THIS ROUTINE ;FROM THE SWITCH ROUTINES VIA KEYEXC ACCORDING ;TO THE FOLLOWING TABLE: ; ; BIT 1 EXECUTE SETRCR AND SETDSP ; 0 EXECUTE SETDSP ; KYSWRT LD A,(KEYEXC) ;KEYSWITCH ROUTINES RETURN POINT OR C ;"OR" IN DEFFERED FUNCTIONS BITS LD (KEYEXC),A KYSWTM LD A,(KEYCNT) ;DECREMENT AND TEST KEYSWITCH COUNTER DEC A JP P,KYSWTH ;BRANCH BACK IF MORE SWITCHES TO TEST LD A,(KEYEXC) ;ANY DEFERRED FUNCTIONS ? AND 3 JR Z,FRQSCN ;BRANCH IF NOT BIT 1,A ;SETRCR NEEDED ? JR Z,5$ ;BRANCH IF NOT CALL SETRCR ;SET UP RECEIVER 5$ CALL SETDSP ;SET UP DISPLAYS ; ; ;AUTO INCREMENT FREQ IF SCAN FLAG SET ; FRQSCN LD HL,BCDWRK ;POINT TO WORK REGISTERS LD A,(RXSTAT) ;SCAN UP FLAG SET ? BIT 5,A JR NZ,5$ ;BRANCH IF YES BIT 4,A ;SCAN DOWN FLAG SET ? JR Z,SMPEND ;BRANCH IF NOT SUB A ;ELSE DOWN-- SET WORK SPACE WITH -100 (BCD) LD (HL),A LD A,99H INC HL LD (HL),A JR 10$ ;GO DO IT 5$ SUB A ;UP FLAG-- LOAD WORK SPACE WITH 100 LD (HL),A INC HL LD A,1 LD (HL),A SUB A 10$ INC HL LD (HL),A INC HL LD (HL),A LD B,1 ;ADD WORKSPACE TO FRQWRK CALL FRQLD LD A,(FRQWRK+3) ;TEST FOR UNDER OR OVERFLOW CP 32H JR C,20$ ;BRANCH IF OK LD A,31H ;PRESET FOR UNDERFLOW JR NZ,15$ ;BRANCH IF UNDERFLOWED, RESET TO 31.999900 MHZ SUB A ;ELSE OVERFLOW-- RESET TO 0 MHZ 15$ LD (FRQWRK+3),A 20$ CALL SETUP ;SET UP MAIN LO AND DISPLAYS CALL SETF1 CALL SETDSP ;REPEAT BACKGROUND ; SMPEND CALL SETURT ;UPDATE UART PARAMETERS LD HL,RXSTAT ;CHECK IF BITE REQUESTED BIT 1,(HL) JP Z,G1CR1 ;TEST REMOTE SYSTEM IF NOT ;THESE ARE THE BUILT-IN-TEST (BITE) ROUTINES. THIS FIRST SECTION SAVES THE ;RECEIVER PARAMETERS AND SETS UP THE INITIAL BITE TEST VALUES. ; BITE SET 2,(HL) ;SET BITE ACTIVE BIT LD (BBUFF+10),SP ;SAVE RECEIVER STACK POINTER LD SP,BITSTK ;START NEW STACK JUST FOR BITE LD HL,FILTER ;SAVE RAM SETUP LD DE,BBUFF LD BC,10 LDIR LD HL,BSETBL ;SET UP RECEIVER FOR BITE LD DE,FILTER LD BC,10 LDIR LD HL,IFTRAN+5 ;FIND LARGEST SYMMETRICAL FILTER FROM IFTRAN LD B,5 ;USE B AS FILTER SLOT INDICATOR / COUNTER LD C,B ;INIT C WITH FILTER 5 FOR STARTING LD A,(HL) ;GET FILTER 5 FIRST FOR COMPARISON 5$ CP (HL) ;COMPARE LATEST BEST WIDTH AGAINST NEXT FILTER JR NC,10$ ;BRANCH IF NARROWER THAN LATEST BEST LD C,B ;ELSE REPLACE EARLIER BEST WITH NEW BEST LD A,(HL) ;GET FILTER RELATIVE WIDTH TO ACCUMULATOR 10$ DEC HL ;ADJUST TEST POINTER DJNZ 5$ ;GO BACK IF MORE TESTS NEEDED LD A,C ;ELSE USE BEST FOUND LD (FILTER),A SUB A ;FORCE INT. REF OUT (94H),A CALL SETRCR ;SET UP RECEIVER WITH BITE VALUES 15$ LD A,(OOLTMR) ;WAIT FOR DUST TO SETTLE AND A JR NZ,15$ SUB A ;INITIALIZE BITE ERROR COUNTER LD (ERBITE),A LD HL,BITTAB ;START WITH FIRST TEST IN BITE TABLE LD (NXTTST),HL ;THIS IS THE MAIN BITE TEST LOOP. RECEIVER PARAMETERS ARE SET UP HERE ;ACCORDING TO THE ENTRIES OF THE BITE TABLE. CONTROL IS PASSED TO THE ;SPECIFIC ROUTINES WHICH FOLLOW THIS ROUTINE INDIRECTLY. THIS ROUTINE'S ;ADDRESS IS PUSHED ON THE STACK WHEN LEAVING SO RETURN BACK HERE OCCURS ;ON THE "RETURN" INSTRUCTION OF THE MAIN TESTS. ; BMLOOP LD HL,BITDSP ;PRINT THE BITE TEST MESSAGE LD C,8FH LD B,16 CALL PRINT LD HL,(NXTTST) ;UPDATE TEST PARAMETERS POINTER BACKUP STORE LD (NXTTST+2),HL LD A,(HL) ;SAVE TEST NUMBER INC HL LD (BITDAT),A LD B,A ;PRINT IT, KEEP OPERATOR FROM BOREDOM CALL SHFTR4 JR Z,5$ ;ELIMINATE LEADING ZEROES ADD A,'0' ;MAKE FIRST DIGIT ASCII OUT (83H),A ;DISPLAY FIRST DIGIT 5$ LD A,B ;DISPLAY SECOND DIGIT AND 0FH ADD A,'0' OUT (82H),A LD B,(HL) ;GET AUX PARAMETER BYTE INC HL BIT 7,B ;AGC/DAC LEVEL SET-UP NEEDED ? JR Z,15$ ;BRANCH IF NOT LD A,(HL) ;LOAD AND OUTPUT MAIN AGC LD (PORT92),A OUT (92H),A CALL TSTISB ;LOAD AND OUTPUT ISB AGC IF ISB INSTALLED JR NZ,10$ LD A,(HL) ; (SAME DATA AS MAIN, BUT SHIFTED) SRL A LD (PORT97),A OUT (97H),A 10$ INC HL ;ADJUST TEST PARAMETERS POINTER LD A,(HL) ;LOAD AND OUTPUT DAC LEVEL INC HL LD (DACLVL),A OUT (2),A 15$ BIT 6,B ;PORT 96 (DETECTOR) NEEDS TO BE SET UP ? JR Z,20$ ;BRANCH IF NOT LD A,(HL) ;ELSE SET IT UP INC HL OUT (96H),A 20$ BIT 5,B ;FREQ SET-UP NEEDED ? JR Z,25$ ;BRANCH IF NOT PUSH DE ;ELSE COPY DATA IN FREQ WORKING BUFFER PUSH BC LD DE,FRQWRK LD BC,4 LDIR PUSH HL CALL SETUP ;THEN SET UP SYNTHESIZER CALL SETFRQ POP HL POP BC POP DE 25$ BIT 4,B ;AGC DUMP REQUESTED ? JR Z,40$ ;BRANCH IF NOT LD A,4 ;ELSE DUMP AGC LD (DMPTMR),A 30$ LD A,(DMPTMR) ;WAIT FOR DUMP TO COMPLETE AND A JR NZ,30$ 35$ LD A,(TSHORT) AND A JR NZ,35$ 40$ LD A,10 ;DEFAULT TO 200 MS DELAY IF NONE REQUESTED BIT 3,B ;BRANCH IF NO DELAY REQUESTED JR Z,45$ LD A,(HL) ;ELSE LOAD DELAY VALUE AND DELAY INC HL 45$ CALL DELAY ;DELAY AND CHECK REMOTE AND SWITCHES JP Z,BITDON ;EXIT IF BITE NO LONGER NEEDED LD IX,BITDAT ;ELSE POINT TO START OF BITE DATA STORAGE LD DE,BMLOOP ;SHOVE LOOP ADDRESS ON STACK FOR RETURN PUSH DE LD A,(RXSTAT) ;STOP-ON-TESTS BITE FLAG SET ? BIT 3,A JR Z,50$ ;BRANCH IF NOT LD DE,DISPBR ;ELSE RETURN BY WAY OF THE DISPLAY BITE PUSH DE ; RESULTS ROUTINE 50$ LD E,(HL) ;VECTOR TO BITE ROUTINE INC HL LD D,(HL) INC HL EX DE,HL JP (HL) ;THIS BITE ROUTINE TESTS THE INTEGRITY OF THE RAMS ; RAMTST LD (IX+1),1 ;LOAD ROUTINE NUMBER IN BITE DATA STORAGE LD (IX+2),4 ;LOAD DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD (NXTTST),HL ;UPDATE THE NEXT TEST PARAMETERS POINTER LD HL,8000H ;POINT TO START OF RAM LD BC,2048 ;SET UP BYTE COUNTER 5$ LD (IX+3),H ;STORE RAM ADDRESS UNDER TEST LD (IX+4),L DI ;KILL INTERRUPTS BETWEEN BYTES LD A,(HL) ;GET MEMORY DATA CPL ;COMPLEMENT IT LD (HL),A ;STORE INVERTED DATA CP (HL) ;SEE IF RAM DATA NOW COMPARES JR NZ,10$ ;BRANCH IF NOT CPL ;RE-INVERT TO ORIGINAL DATA LD (HL),A ;STORE BACK INTO RAM CP (HL) ;VERIFY DATA AGAIN JR Z,15$ ;BRANCH IF OK 10$ LD (IX+5),A ;STORE REFERENCE DATA LD A,(HL) ;STORE ACTUAL DATA LD (IX+6),A EI ;RE-ENABLE INTERRUPTS BEFORE ERROR PROCESSING JP ERROR ;PROCESS ERROR 15$ LD (IX+5),A ;STORE REFERENCE DATA LD A,(HL) ;STORE ACTUAL DATA LD (IX+6),A EI ;RE-ENABLE INTERRUPTS BETWEEN BYTES INC HL ;MOVE UP TO NEXT LOCATION FOR TEST DEC BC ;TEST COUNTER LD A,C OR B JR NZ,5$ ;BACK FOR MORE IF NEEDED RET ;DONE ;THIS ROUTINE TESTS A BIT (OR GROUP OF BITS) FROM A PORT FOR PROPER POLARITY ; BITTST LD (IX+1),2 ;STORE ROUTINE NUMBER LD (IX+2),4 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET PORT NUMBER TO C AND BITE DATA STORAGE LD (IX+3),C INC HL LD B,(HL) ;GET MASK TO B AND STORAGE LD (IX+4),B INC HL LD D,(HL) ;GET POLARITY TO D AND STORAGE LD (IX+5),D INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST IN A,(C) ;GET DATA FROM PORT AND SAVE IT LD (IX+6),A XOR D ;TEST BITS AND B ;KEEP ONLY RELEVANT BITS RET Z ;DONE IF OK JP ERROR ;ERROR IF POLARITY INCORRECT ; ; ;THIS ROUTINE TESTS WHETHER A SIGNAL VALUE IS GREATER THAN A REFERENCE ; XGTK LD (IX+1),3 ;STORE ROUTINE NUMBER LD (IX+2),3 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C AND STORAGE LD (IX+3),C INC HL LD D,(HL) ;GET TEST LEVEL TO D AND STORAGE LD (IX+4),D INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST CALL DACCVT ;CONVERT DATA AND SAVE IN BITE STORAGE LD (IX+5),A LD (BITPAR),A ;SAVE LEVEL FOR LATER TESTS IF NEEDED CP D ;COMPARE TO TEST LEVEL RET NC ;DONE IF OK JP ERROR ;ERROR IF DATA SMALLER THAN TEST LEVEL ; ; ;THIS ROUTINE TESTS WHETHER A SIGNAL VALUE IS LESS THAN A REFERENCE ; XLTK LD (IX+1),4 ;STORE ROUTINE NUMBER LD (IX+2),3 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C AND STORAGE LD (IX+3),C INC HL LD D,(HL) ;GET TEST LEVEL TO D AND STORAGE LD (IX+4),D INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST CALL DACCVT ;CONVERT DATA AND SAVE LD (IX+5),A LD (BITPAR),A ;SAVE LEVEL FOR LATER TESTS IF NEEDED CP D ;COMPARE DATA TO TEST LEVEL RET C ;DONE IF OK JP ERROR ;ERROR IF DATA IS GREATER OR EQUAL TO TEST REF ; ; ;THESE ROUTINES TEST WHETHER THE BASEBAND CONVERTER IS INSTALLED. IF YES, ;TESTING IS HANDED OVER TO XLTK AND XGTK. IF NOT, THE TEST PARAMETERS POINTER ;IS ADJUSTED AND CONTROL IS RETURNED TO THE MAIN TEST LOOP. ; BSXLTK IN A,(95H) ;BRANCH IF BASEBAND CONVERTER IS INSTALLED BIT 6,A JR Z,XLTK JR BSX5 ;ELSE SKIP THIS TEST ; BSXGTK IN A,(95H) ;BRANCH IF BASEBAND CONVERTER IS INSTALLED BIT 6,A JR Z,XGTK BSX5 LD (IX+1),8 ;ELSE STORE NO BASEBAND CONV DISPLAY DATA LD (IX+2),4 ;LOAD DATA COUNTER LD (IX+3),95H ;DISPLAY PORT NUMBER (95) LD (IX+4),40H ;DISPLAY PORT 95 BIT 6 MASK LD (IX+5),0 ;DISPLAY PORT 95 BIT 6 POLARITY LD (IX+6),A ;DISPLAY PORT 95 DATA FOR USER EX DE,HL ;THIS TEST DONE INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR INC HL ; NEXT TEST LD (NXTTST),HL RET ;RETURN TO MAIN TEST LOOP ; ; ;THIS ROUTINE ADJUSTS A PARAMETER MASKED BY C TO THE LEVELS SPECIFIED IN ;D & E BY ADJUSTING THE MGC LEVEL. ERROR RESULTS IF ADJUSTMENT CANNOT BE ;ACHIEVED IN B TRIES. ; SERVO LD (IX+1),5 ;STORE ROUTINE NUMBER LD (IX+2),4 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C AND STORAGE LD (IX+3),C INC HL LD D,(HL) ;GET LOWER TEST LIMIT TO D AND STORAGE LD (IX+4),D INC HL LD E,(HL) ;GET UPPER TEST LIMIT TO E AND STORAGE LD (IX+5),E INC HL LD B,(HL) ;GET MAX TRIES TO B INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST LD HL,DACLVL ;POINT TO DACLVL 5$ CALL DACCVT ;CONVERT DATA AND SAVE IT LD (IX+6),A LD (IX+7),B ;ALSO SAVE COUNTER VALUE CP D ;TEST DATA JR C,10$ ;BRANCH IF TOO SMALL CP E RET C ;DONE IF IN RANGE DEC (HL) ;ADJUST MGC LEVEL JR 15$ 10$ INC (HL) ;ADJUST MGC LEVEL 15$ LD A,(HL) ;OUTPUT DAC LEVEL LD (IX+8),A ;SAVE A COPY FOR OFF-LINE TESTING OUT (2),A LD A,10 ;PAUSE FOR 200 MS CALL DELAY JP Z,BITDON ;DONE IF BITE NO LONGER NEEDED DJNZ 5$ ;TRY AGAIN JP ERROR ;ERROR IF OUT OF TRIES ; ; ;THIS ROUTINE CONVERTS A SIGNAL AND COMPARES IT AGAINST THE SIGNAL CONVERTED ;PREVIOUSLY, STORED IN BITPAR. SUCCESS REQUIRES THE ABSOLUTE DIFFERENCE ;BETWEEN THE TWO TO BE LESS THAN THE VALUE PASSED INTO D. ; DELTA LD (IX+1),6 ;STORE ROUTINE NUMBER LD (IX+2),4 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C AND STORAGE LD (IX+3),C INC HL LD D,(HL) ;GET ALLOWED DIFFERENCE LEVEL TO D AND STORAGE LD (IX+4),D INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST LD A,(BITPAR) ;GET REFERENCE TAKEN IN PREVIOUS TEST TO E LD E,A ; AND STORAGE LD (IX+5),E CALL DACCVT ;CONVERT DATA LD (IX+6),A ;SAVE A COPY FOR OFF-LINE TESTING SUB E ;CALCULATE DIFFERENCE FROM REF TEST DATA JR NC,5$ ;BRANCH IF DIFFERENCE IS POSITIVE NEG ;ELSE MAKE POSITIVE 5$ CP D ;COMPARE DIFFERENCE TO ALLOWED LEVEL RET C ;DONE IF OK JP ERROR ;ERROR IF DIFFERENCE IS GREATER THAN ALLOWED ; ; ;THESE ROUTINES VERIFY THE FILTER COMPLEMENT LISTED IN FILTAB. THE FIRST IS A ;SET-UP ROUTINE ONLY, AND DOES NOT GENERATE ANY ERRORS. THE SECOND ROUTINE ;ACTUALLY PERFORMS THE FILTER VERIFICATION TESTS. ; FILSUP LD (IX+1),0 ;SET UP DUMMY DISPLAY VALUES FOR SETUP LD (IX+2),1 ; ROUTINE EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C CALL DACCVT ;CONVERT REFERENCE FILTER DATA LD (IX+3),A ;STORE REF DATA IN CASE IT IS INTERESTING LD (BITPAR),A ;SAVE DATA FOR USE BY MAIN ROUTINE NEXT INC HL ;UPDATE TEST PARAMETERS POINTER FOR REAL LD (NXTTST),HL ; TESTS BELOW RET ;GO BACK THROUGH LOOP FOR MAIN TESTS ; ; FILVER LD (IX+1),7 ;STORE ROUTINE NUMBER LD (IX+2),4 ;STORE DATA COUNTER EX DE,HL ;GET DATA POINTER TO HL LD C,(HL) ;GET A/D MASK TO C AND STORAGE LD (IX+3),C INC HL LD D,(HL) ;GET ALLOWED DIFFERENCE LEVEL TO D AND STORAGE LD (IX+4),D INC HL LD A,(BITPAR) ;GET REFERENCE TEST LEVEL TO E AND STORAGE LD E,A LD (IX+5),E LD A,(HL) ;GET FILTER NUMBER FOR TEST LD (FILTER),A INC HL ;UPDATE TEST PARAMETERS POINTER AND SAVE FOR LD (NXTTST),HL ; NEXT TEST PUSH DE ;SAVE REGS PUSH BC CALL SETUP ;SET UP FREQ & BFO & FILTER CALL SETFRQ CALL SETBFO CALL SETFIL LD A,(DETECT) ;SAVE THIS DETECTOR IN CASE ISB & FL1 TEST LD (BITPAR+1),A CALL TSTISB ;RE-ROUTE AUDIO IF ISB INSTALLED AND 1ST FILTER JR NZ,5$ ; BEING TESTED LD A,(FILTER) CP 1 JR NZ,5$ LD A,6 ;ISB & FL1- TEMP SET DETECTOR FOR LSB FOR SETCP LD (DETECT),A POP BC ;RESET DACCVT POINTER TO CONVERT ISB AGC LD C,8 PUSH BC 5$ CALL SETCP ;SET UP CROSSPOINT SWITCH AUDIO PATHS LD A,(BITPAR+1) ;RETURN TO ORIGINAL DETECTOR IN CASE CHANGED LD (DETECT),A POP BC ;RESTORE REGS POP DE LD A,4 ;DUMP AGC LD (DMPTMR),A LD A,25 ;DELAY 500 MS CALL DELAY JP Z,BITDON ;DONE IF BITE NO LONGER NEEDED LD HL,FILTER ;SEE IF NULL FILTER SLOT LD A,(HL) RLCA ADD A,(HL) LD HL,FILTAB CALL ADC LD A,(HL) CP 0B0H JR NZ,10$ ;BRANCH IF NOT LD (IX+7),1 ;ELSE LOAD OFF-LINE TEST INDICATOR CALL DACCVT ;VERIFY SLOT EMPTY LD (IX+6),A ;SAVE RESULT FOR OFF-LINE TESTING CP 212 RET NC ;DONE IF EMPTY JP ERROR ;ERROR IF NOT EMPTY 10$ LD (IX+7),2 ;LOAD OFF-LINE TEST INDICATOR CALL DACCVT ;TEST IF THIS FILTER HAS CORRECT INSERTION LOSS LD (IX+6),A ;SAVE RESULT FOR OFF-LINE TESTING SUB E ;CALCULATE ABSOLUTE DIFFERENCE FROM REFERENCE JR NC,15$ NEG 15$ CP D ;TEST DIFFERENCE RET C ;OK IF DIFFERENCE WITHIN PRESCRIBED LIMITS JP ERROR ;ELSE ERROR ;THIS ROUTINE DELAYS FOR "A" MULTIPLES OF 20 MS AND MONITORS THE LOCAL ;KEYSWITCHES AS WELL AS REMOTE CONTROL SYSTEM FOR RELEVANT ACTIVITY ; DELAY PUSH BC ;SAVE BC LD B,1 ;DEFAULT B TO 1 IF NO DELAY NEEDED AND A JR Z,D10 LD B,A ;ELSE USE REQUESTED DELAY VALUE D5 LD A,40 ;LOAD TIMER FOR 20 MS LD (TIMER),A D10 PUSH BC ;SAVE REGS PUSH DE PUSH HL LD HL,(BBUFF+10) ;RETRIEVE RECEIVER STACK POINTER LD (BBUFF+10),SP ;SAVE BITE STACK POINTER LD SP,HL JP G1CR1 ;GO CHECK REMOTE ; BITRTN LD A,(TIMER) ;WAIT FOR TIMER TO COMPLETE AND A JR NZ,BITRTN LD HL,RXSTAT ;POINT TO STATUS BIT 0,(HL) ;BRANCH IF REMOTE JR NZ,10$ IN A,(1) ;TEST LOCAL KEYSWITCHES CP 0B7H ;TERMINATE BITE IF LOCK-2 OR LOCK-3 PRESSED JR Z,5$ CP 0BDH JR NZ,10$ 5$ RES 1,(HL) ;TERMINATE BITE 10$ BIT 1,(HL) ;BITE STILL NEEDED ? LD HL,(BBUFF+10) ;SHUFFLE STACK POINTERS AGAIN, END WITH LD (BBUFF+10),SP ; BITE STACK POINTER ACTIVE LD SP,HL POP HL POP DE POP BC JR Z,15$ ;BRANCH IF BITE NOT NEEDED DJNZ D5 ;ELSE PAUSE AGAIN 15$ POP BC ;RETRIEVE ORIGINAL BC RET ;DONE-- RETURN WITH Z FLAG SET IF BITE STOPPED ;THIS IS THE ENDING ROUTINE FOR BITE ; BITDON IN A,(0) ;WAIT UNTIL ALL SWITCHES RELEASED CP 0FFH JR NZ,BITDON IN A,(1) CP 0FFH JR NZ,BITDON LD A,(PORT94) ;SET UP THE ORIGINAL REFERENCE SOURCE OUT (94H),A LD A,25 ;PAUSE 500 MS WHILE REFERENCE SETTLES CALL DELAY LD HL,BBUFF ;RESTORE RAM LD DE,FILTER LD BC,10 LDIR LD SP,(BBUFF+10) ;RETRIEVE RECEIVER STACK POINTER DI ;NO INTERRUPTS ALLOWED WHILE BITE FLAGS LD A,(RXSTAT) ; ARE BEING CLEARED AND 0F1H LD (RXSTAT),A EI CALL SETRCR ;SET UP RECEIVER CALL SETDSP ;SET UP DISPLAYS JP G1CR1 ;DONE-- CHECK REMOTE SYSTEM ;THIS ROUTINE DISPLAYS THE BITE ERROR AND IF IN LOCAL, WILL WAIT UNTIL ;A COMMAND IS GIVEN FROM THE FRONT PANEL BEFORE PROCEEDING ; ERROR LD HL,BERMSG ;PRINT ERROR MESSAGE LD C,8BH LD B,7 CALL PRINT LD A,(RXSTAT) ;GET REMOTE FLAG TO C FOR LATER LD C,A LD A,(BITDAT) ;GET ERROR NUMBER TO B LD B,A LD HL,ERBITE ;INCLUDE THIS ERROR IN LIST (IF NOT ALREADY 5) LD A,(HL) CP 5 JR NC,5$ INC A LD (HL),A CALL ADC LD (HL),B 5$ BIT 0,C ;BRANCH IF LOCAL BITE TO TEST SWITCHES JR Z,BITESW CP 5 ;REMOTE-- GO AFTER NEXT TEST IF NOT ALREADY RET C ; 5 ERRORS JR BITDON ;ELSE DONE ; ; ;THIS ROUTINE TESTS THE BITE FUNCTIONAL KEYSWITCHES AND TAKES ;APPROPRIATE ACTION ; BITESW CALL UNBUTN ;WAIT UNTIL ALL SWITCHES ARE RELEASED 5$ IN A,(0) ;INPUT KEY SWITCHES LD B,A IN A,(1) CP 0B7H ;IS LOCK-2 PRESSED ? JR Z,BITDON ;BRANCH IF YES, DONE CP 0BDH ;IS LOCK-3 PRESSED ? JR Z,BITDON ;BRANCH IF YES, DONE BIT 6,A ;IS LOCK-4 PRESSED ? JR NZ,10$ ;BRANCH IF NOT BIT 4,B RET Z ;CONTINUE IF YES 10$ CP 9FH ;IS LOCK-1 PRESSED ? JR NZ,15$ ;BRANCH IF NOT LD HL,(NXTTST+2) ;REPEAT TEST IF IT IS LD (NXTTST),HL RET 15$ CP 0BBH ;IS LOCK-0 PRESSED ? JR NZ,5$ ;BRANCH IF NOT LD A,(RXSTAT) ;IS STOP-ON-BITE-TESTS FLAG SET ? BIT 3,A RET NZ ;USE RET MECH IF YES, ELSE JUST FALL THROUGH ; ; ;THIS ROUTINE DISPLAYS THE BITE RESULTS OF THE LATEST TEST ; DISPBR LD HL,BLANKS ;BLANK INITIAL BITE DISPLAY BUFFER LD DE,BITFMT LD BC,16 LDIR LD HL,BITDAT ;POINT TO RAW BITE TEST DATA LD DE,BITFMT ;PREPARE TO LOAD INTO DISPLAY BUFFER LD A,(HL) ;TRANSLATE TEST NUMBER TO ASCII AND LOAD IT INC HL CALL PRHEX LD A,(HL) ;NEXT LOAD ROUTINE NUMBER INC HL CALL PRHEX LD B,(HL) ;LOAD B WITH COUNT OF REMAINING DATA 5$ INC HL ;LOAD REMAINING DATA LD A,(HL) CALL PRHEX INC DE ;LEAVE INIT SPACE BETWEEN ASCII HEX PAIRS DJNZ 5$ ;LOAD ALL REQUESTED BYTES LD HL,BITFMT ;DISPLAY BITE TEST RESULTS LD C,8FH LD B,16 CALL PRINT JR BITESW ;TEST SWITCHES FOR NEXT ACTION ;THIS ROUTINE HANDLES THE NUMERIC KEYS ; KYNUM LD A,(KEYCNT) ;GET SWITCH NUMBER LD B,A ;SAVE IN B REG IN A,(1) ;"ENT" PRESSED ? BIT 0,A JP Z,KYMON ;GO TO MONITOR ROUTINES IF YES LD D,A ;BRANCH IF FORCE FILTER MODE ACTIVE SUB A LD HL,FFSCR ADD A,(HL) JR NZ,35$ BIT 6,D ;"LOCK" PRESSED ? JP Z,KYSPEC ;GO TO SPECIAL ROUTINES IF YES LD A,(MODEWD) ;FREQUENCY MODE ? CP 5 JR NZ,30$ ;NO INPUT ALLOWED IF NOT LD A,(FRQPTR) ;INPUT ALLOWED ? CP 80H JR Z,30$ ;BRANCH IF NOT AND A ;FIRST DIGIT ? JR NZ,10$ ;BRANCH IF NOT LD A,B ;VALID 10 MHZ DIGIT ? CP 4 JR NC,30$ ;BRANCH IF NOT LD HL,BLANKS ;VALID DIGIT-- SET UP DISPLAY FIELD LD DE,FRQDSP LD BC,11 LDIR EX DE,HL LD B,9 ;AFTER SPACES FOR INITIAL DISPLAY, INSERT ADD A,'0' ;FIRST DIGIT IN ASCII 5$ LD (HL),A INC HL ;THEN FILL IN REST WITH ASCII ZEROES LD A,'0' DJNZ 5$ LD A,'.' ;LOAD DECIMAL POINT IN PLACE NOW LD (FRQDSP+13),A LD A,7 ;SET UP NEXT FRQPTR VALUE JR 25$ ;GO FINISH UP 10$ CP 7 ;1 MHZ DIGIT ENTRY ? JR NZ,15$ ;BRANCH IF NOT LD A,(FRQDSP+11) ;MAKE SURE VALID FREQ-- SEE IF OVER 32 MHZ CP '3' JR C,15$ ;BRANCH IF LESS THAN 30 MHZ LD A,B ;ELSE CHECK 1 MHZ DIGIT IS LESS THAN 2 CP 2 JR NC,30$ ;BRANCH AND IGNORE IF 32 MHZ OR OVER 15$ LD A,B ;GET NEW DIGIT ADD A,'0' ;MAKE ASCII LD (FRQDSP+12),A ;LOAD IT JUST OFF SCREEN TO RIGHT 20$ LD HL,FRQDSP+1 ;SHIFT WHOLE BUFFER TO LEFT ONE SPACE LD DE,FRQDSP LD BC,19 LDIR LD A,(FRQDSP+12) ;SHIFT AGAIN IF DECIMAL POINT COMING UP CP '.' JR Z,20$ LD A,(FRQPTR) ;UPDATE FRQPTR DEC A JR NZ,25$ ;BRANCH IF MORE TO GO LD A,80H ;ELSE TERMINATE FURTHER ENTRY 25$ LD (FRQPTR),A LD C,1 ;UPDATE DISPLAYS ONLY 30$ JP KYSWRT ;DONE ; 35$ SET 7,(HL) ;FORCE FILTER-- SET NUMERIC ENTRY ACTIVE FLAG LD HL,FILTAB+2 ;POINT TO FILTER DATA IN TABLE LD D,A ;SAVE COPY OF FILTER SLOT NUMBER WITH OLD AND 7 ; NUMERIC ENTRY ACTIVE FLAG LD C,A RLCA ADD A,C CALL ADC BIT 7,D ;WAS OLD NUMERIC ENTRY FLAG ACTIVE ? JR NZ,40$ ;BRANCH IF YES, SHIFT IN NEW DIGIT DEC HL ;ELSE INITIALIZE 0 DATA FOR NEW DIGIT DEC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 40$ LD A,B ;SHIFT UP OLD DATA, SHIFT IN NEW RLD DEC HL RLD DEC HL RLD LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE MODE KEYSWITCH ; KYMODE LD HL,MODEWD ;GET MODE WORD INC (HL) ;UPDATE IT LD A,(HL) CP 7 ;TEST IT JR C,5$ ;OK IF 2-6 LD (HL),2 ;ELSE START OVER WITH 2 (METER) 5$ CP 3 ;FILTER MODE ? JR NZ,10$ ;BRANCH IF NOT-- ALL ELSE AUTOMATICALLY OK LD A,(DETECT) ;SEE IF FILTER MODE OK AND A JR Z,KYMODE ;BRANCH IF NOT-- SSB MODE CP 5 JR NC,KYMODE 10$ SUB A ;KILL FREQUENCY ENTRY LD (FRQPTR),A LD C,1 ;UPDATE DISPLAYS JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE SUB-MODE KEYSWITCH. A TABLE PROVIDES THE ;TARGET SWITCH JUMP LOCATION ; KYSMOD LD A,(RXSTAT) ;GET REMOTE STATUS BIT TO B LD B,A LD A,(FFSCR) ;TEST AND BRANCH IF FORCE FILTER MODE AND A ; ACTIVE, WITH DEFAULT VALUE LD A,10 JR NZ,5$ LD A,(MODEWD) ;GET MODEWORD CP 2 ;METER SELECT ? JR Z,10$ ;BRANCH IF YES 5$ BIT 0,B ;ALL ELSE ONLY ALLOWED IF LOCAL JP NZ,KYSWRT ;DONE IF REMOTE 10$ RLCA ;DOUBLE MODE WORD LD HL,ADRTBL-4 CALL ADC ;GET SERVICE ADDRESS FROM TABLE TO HL REG PAIR EX DE,HL LD A,(DE) LD L,A INC DE LD A,(DE) LD H,A JP (HL) ;JUMP TO SERVICE ROUTINE ; ; ;THIS ROUTINE HANDLES THE METER SUBMODE FUNCTION. BIT 6 OF RXSTAT IS ;TOGGLED ON OR OFF TO SELECT THE AF OR RF METER FOR DISPLAY, RESPECTIVELY. ; SMMETR LD A,(RXSTAT) ;INVERT METER CONTROL BIT XOR 40H LD (RXSTAT),A LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; ;THIS SUBMODE ROUTINE HANDLES THE FILTER ; SMFILT LD A,(DETECT) ;BANDWIDTH CHANGE ALLOWED ? AND A JP Z,KYSWRT ;NOT IF ISB-L CP 5 JP NC,KYSWRT ;NOT IF OTHER SSB MODE LD A,(FILTER) ;AM,FM,CW-- GET OLD FILTER'S RELATIVE WIDTH LD HL,IFTRAN CALL ADC LD A,(HL) INC A ;INCREMENT TO NEXT RELATIVE WIDTH SIZE 5$ LD B,6 ;TEST OTHER IFTRAN ENTRIES FOR NEW SIZE MATCH LD HL,IFTRAN+5 10$ CP (HL) ;MATCH ? JR Z,15$ ;BRANCH IF YES DEC HL ;ELSE TRY NEXT LOWER ENTRY DJNZ 10$ CP 1 ;NOT FOUND-- LOOKING FOR NARROWEST ? JP Z,KYSWRT ;DONE IF YES-- FAILURE LD A,1 ;ELSE START LOOKING FOR NARROWEST NOW JR 5$ 15$ LD A,B ;FILTER SLOT FOUND-- UPDATE STORAGE DEC A ;CORRECT COUNTER / INDEX TO MAKE SLOT NUMBER LD (FILTER),A LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ; ; ;THIS SUBMODE ROUTINE HANDLES THE AGC ; SMAGC LD HL,AGC ;POINT TO AGC DATA LD A,(DETECT) ;TEST DETECTOR MODE CP 5 LD A,(HL) ;GET AGC BEFORE DECISION JR NZ,5$ ;BRANCH IF NOT ISB-L LD B,10H ;ISB AGC-- PREPARE MEDIUM IN CASE SPECIAL SHORT LD C,7 ;PREPARE MASK TO SAVE MAIN AGC INTACT AND 1CH ;ISOLATE OLD ISB AGC JR Z,15$ ;BRANCH, USE MEDIUM DEFAULT IF SPECIAL SHORT ADD A,8 ;ELSE UPDATE ISB AGC NORMALLY AND 1CH ;ELIMINATE POSSIBLE OVERFLOW JR NZ,10$ ;BRANCH IF RESULT IS VALID ADD A,8 ;ELSE INCREMENT ISB AGC TO NORMAL SHORT JR 10$ ;GO FINISH UP 5$ LD C,18H ;MAIN AGC-- PREPARE MASK TO SAVE ISB AGC INTACT INC A ;UPDATE MAIN AGC AND 7 JR NZ,10$ ;BRANCH IF RESULT IS VALID INC A ;ELSE INCREMENT TO VALID SHORT 10$ LD B,A ;SAVE RESULT TEMP 15$ LD A,C ;MASK IN ORIGINAL OTHER AGC VALUE AND (HL) OR B ;ADD IN THIS NEW UPDATED AGC VALUE LD (HL),A ;UPDATE STORAGE WITH NEW DATA LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ; ; ;THIS SUBMODE ROUTINE KILLS THE FREQUENCY ENTRY FLAG ; SMFREQ SUB A ;KILL FREQUENCY ENTRY LD (FRQPTR),A LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; ;THIS SUBMODE ROUTINE HANDLES THE DETECTOR ; SMDET LD HL,DETNRM ;POINT TO NON-ISB DETECTOR UPDATE TABLE CALL TSTISB JR NZ,5$ ;BRANCH IF ISB NOT INSTALLED LD HL,DETISB ;ELSE USE ISB INSTALLED DETECTOR UPDATE TABLE 5$ LD A,(DETECT) ;UPDATE DETECTOR USING TABLE CALL ADC LD A,(HL) LD (DETECT),A LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ; ; ;THESE SUBMODE ROUTINES HANDLE THE REFERENCE SELECTIONS. THE FIRST HANDLES THE ;SOURCE SELECTION (EXT / INT) WHILE THE SECOND HANDLES THE EXTERNAL VALUE ;SELECTION (1,5,10 MHZ). ; SMREFS LD A,(PORT94) ;TOGGLE THE EXT / INT REF FLAG (1=EXT, 0=INT) XOR 1 LD (PORT94),A OUT (94H),A ;OUTPUT TO HARDWARE LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ; ; SMREFV LD A,(PORT94) ;INCREMENT EXT REF FREQ VALUE (BUT KEEP IT RRCA ; 0-2 WHERE 0=1 MHZ, 1=5 MHZ, AND 2=10 MHZ) INC A LD B,A AND 3 CP 3 LD A,B JR C,5$ AND 0FCH 5$ RLCA ;POSITION NEW DATA AND OUTPUT LD (PORT94),A OUT (94H),A LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE FORCE FILTER SUBMODE FUNCTION. WHEN SUBMODE IS ;PRESSED, IT PROVIDES VARIOUS OPTIONS FOR THE FILTER BEING SET UP. ; SMFORF LD HL,FILTAB ;POINT TO FILTER DATA TABLE LD A,(FFSCR) ;AUGMENT POINTER USING FORCE FILTER SLOT NUMBER AND 7 LD B,A RLCA ADD A,B CALL ADC EX DE,HL ;GET FILTAB POINTER TO DE LD HL,FFSCR ;TEST (AND RESET) NUMERIC ENTRY ACTIVE FLAG BIT 7,(HL) RES 7,(HL) INC HL ;POINT TO ORIGINAL DATA BUFFER WITH HL JR NZ,15$ ;BRANCH IF NUM ENTRY WAS ACTIVE, LOAD ORIG DATA LD A,(DE) ;GET PRESENT DATA CP 0B0H JR C,5$ ;BRANCH IF NUMERIC ADD A,4 ;ELSE UPDATE FILTER TYPE CP 0BCH JR C,10$ ;BRANCH IF STILL VALID LD A,(HL) ;TEST IF ORIG DATA WAS NUMERIC CP 0B0H JR C,15$ ;BRANCH AND RELOAD IT IF YES 5$ LD A,0B0H ;ELSE START OVER WITH NULL FILTER INDICATOR 10$ LD (DE),A ;LOAD NEW FILTER TYPE IF NOT NUMERIC INC DE SUB A ;KILL UNUSED ENTRIES LD (DE),A INC DE LD (DE),A JR 20$ ;GO FINISH UP 15$ LD BC,3 ;COPY BACK ORIGINAL FILTER DATA LDIR 20$ LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE ENTER KEY ; KYENT LD HL,RXSTAT ;MONITOR MODE ? BIT 7,(HL) JR NZ,35$ ;DONE IF YES LD A,(FFSCR) ;BRANCH IF FORCE FILTER MODE ACTIVE AND 7 JR NZ,40$ LD HL,MODEWD ;TEST MODE WORD LD A,(HL) CP 7 ;BRANCH IF NORMAL (2-6) JR C,15$ JR Z,5$ ;BRANCH IF REF SOURCE SELECT MODE (EXT / INT) INC HL ;ELSE REF VALUE SELECT MODE LD A,(HL) ;REF VALUE SELECT MODE DONE-- RESTORE ORIGINAL DEC HL ; MODE WORD JR 10$ ;GO FINISH UP 5$ INC A ;INCREMENT TO REF VALUE SELECT MODE 10$ LD (HL),A ;UPDATE MODE WORD JR 30$ ;GO FINISH UP 15$ LD A,(FRQPTR) ;FREQUENCY ENTRY ACTIVE ? AND A JR Z,35$ ;BRANCH AND IGNORE IF NOT SUB A ;ELSE ZERO ENTRY FLAG LD (FRQPTR),A LD A,(TUNCTR) ;LOCK TUNING AND 0F0H OR 4 LD (TUNCTR),A LD DE,FRQDSP+2 ;TRANSFER NEW FREQUENCY INTO WORKING BUFFER 20$ INC DE ;FIRST FIND START OF DATA IN ASCII BUFFER LD A,(DE) CP ' ' JR Z,20$ LD HL,FRQWRK+3 ;POINT TO WORKING BUFFER AREA LD B,4 ;LOAD 4 PACKED BCD BYTES (8 DIGITS) 25$ LD A,(DE) ;GET ASCII DATA INC DE CP '.' ;THROW AWAY DECIMAL POINTS JR Z,25$ CALL SHFTL4 ;CONVERT TO BCD AND SHIFT UP TO UPPER NIBBLE LD C,A LD A,(DE) ;GET LOWER NIBBLE DATA, CONVERT TO BCD, AND ADD AND 0FH ; TO UPPER DIGIT ADD A,C LD (HL),A ;PUT TOTAL INTO WORKING BUFFER INC DE DEC HL DJNZ 25$ ;GO AFTER NEXT DATA 30$ LD C,3 ;SET UP RECEIVER AND DISPLAYS 35$ JP KYSWRT ;DONE ; 40$ INC A ;FORCE FILTER MODE-- LOOK AT NEXT FILTER CP 6 JR C,45$ CALL BWTAB ;SET UP FILTER TABLES IF ALL DONE SUB A ;KILL FORCE FILTER MODE 45$ LD (FFSCR),A ;UPDATE FORCE FILTER CONTROL STORAGE LD B,A ;COPY ORIGINAL FILTER DATA FOR THIS SLOT RLCA ; INTO BACK-UP STORAGE ADD A,B LD HL,FILTAB CALL ADC LD DE,FFSCR+1 LD BC,3 LDIR LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE REMOTE/LOCAL SWITCH FUNCTION ; KYREM LD HL,RXSTAT ;POINT TO STATUS WORD BIT 0,(HL) ;TEST OLD REMOTE BIT JR NZ,5$ ;BRANCH TO SWITCH TO LOCAL SET 0,(HL) ;ELSE SWITCH TO REMOTE CALL RCOMEX ;SET UP REMOTE COMMANDS VIA RCOMEX JR 10$ ;DONE 5$ RES 0,(HL) ;SWITCH TO LOCAL INC HL INC HL RES 2,(HL) ;KILL OVERIDE MODE 10$ LD C,3 ;EXECUTE AND DISPLAY NEW DATA JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE TUNE SWITCH ; KYTUN SUB A ;KILL FREQUENCY ENTRY LD (FRQPTR),A LD HL,TUNCTR ;POINT TO FREQ AND BFO TUNE CONTROL LD A,(MODEWD) ;TEST MODE WORD CP 6 JR Z,25$ ;BRANCH IF DETECTOR MODE ACTIVE CP 5 JR Z,10$ ;BRANCH IF FREQ MODE ACTIVE 5$ LD A,5 ;ELSE FORCE FREQ MODE LD (MODEWD),A JR 35$ ;GO FINISH UP 10$ LD A,(HL) ;TEST FREQ TUNING AND 0FH CP 4 JR C,15$ ;BRANCH IF NOT LOCKED LD A,2 ;ELSE FORCE FINE TUNING 15$ DEC A ;GO TO NEXT TUNING INCREMENT JR NZ,20$ ;BRANCH IF NOT AT BOTTOM LD A,3 ;ELSE START OVER WITH FAST TUNING 20$ LD B,A ;UPDATE RAM, PRESERVE BFO TUNING STATUS LD A,(HL) AND 0F0H OR B LD (HL),A JR 35$ ;GO FINISH UP 25$ LD A,(DETECT) ;CW DETECTOR MODE ? CP 4 JR NZ,30$ ;BRANCH IF NOT CW FIXED DEC A ;ELSE FORCE CW VARIABLE LD (DETECT),A LD C,3 ;REQUEST SETRCR AND SETDSP JR 40$ ;DONE 30$ CP 3 ;BRANCH IF NOT CW VARIABLE, FORCE FREQ MODE JR NZ,5$ RES 6,(HL) ;ELSE UNLOCK BFO TUNING 35$ LD C,1 ;UPDATE DISPLAYS 40$ JP KYSWRT ;DONE ;THIS ROUTINE HANDLES THE LOCK SWITCH ; KYLOCK LD A,(TUNCTR) ;GET TUNING CONTROL LD B,A LD A,(MODEWD) ;TEST ACTIVE MODE CP 5 JR NZ,5$ ;BRANCH IF NOT FREQ LD A,B ;ELSE LOCK FREQ TUNING AND 0F0H OR 4 JR 10$ ;GO FINISH UP 5$ CP 6 ;BRANCH IF NOT DETECTOR MODE JR NZ,15$ LD A,(DETECT) ;MUST BE CW VARIABLE MODE TO LOCK BFO TUNING CP 3 JR NZ,15$ ;BRANCH IF NOT LD A,B ;ELSE LOCK BFO TUNING AND 0FH OR 40H 10$ LD (TUNCTR),A 15$ SUB A ;KILL FREQUENCY ENTRY LD (FRQPTR),A LD HL,RXSTAT ;KILL THE SCAN FLAGS RES 4,(HL) RES 5,(HL) LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ;THESE ARE THE SPECIAL SECONDARY LOCK FUNCTION ROUTINES. THE FIRST IS THE ;DISPATCH VECTORING ROUTINE. THE REST ARE THE DISPATCH ROUTINES THEMSELVES. ; KYSPEC LD HL,SPCTBL ;POINT TO THE DISPATCH ADDRESS TABLE LD A,B ;GET THE SWITCH NUMBER RLCA CALL ADC LD E,(HL) ;GET THE DISPATCH ROUTINE ADDRESS TO HL INC HL LD D,(HL) EX DE,HL JP (HL) ;JUMP INTO THE DISPATCH ROUTINE ; ; KYSPC0 LD HL,RXSTAT ;INITIATE BITE WITH STOP-ON-TESTS FEATURE SET 1,(HL) ;REQUEST BITE SET 3,(HL) ;SET STOP-ON-TESTS FLAG LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; KYSPC1 LD HL,RXSTAT ;INITIATE NORMAL BITE SET 1,(HL) LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; KYSPC5 LD A,1 ;INITIATE FORCE FILTER MODE, STARTING WITH LD (FFSCR),A ; FILTER SLOT 1 LD HL,FILTAB+3 ;COPY ORIGINAL FL1 DATA INTO BACKUP BUFFER LD DE,FFSCR+1 LD BC,3 LDIR LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; KYSPC6 LD A,(MODEWD) ;SAVE ORIGINAL MODE AND SET REFERENCE SOURCE LD (MODEWD+1),A ; SELECT MODE LD A,7 LD (MODEWD),A LD C,1 ;REQUEST SETDSP JP KYSWRT ;DONE ; ; KYSPC8 LD HL,RXSTAT ;SET THE SCAN UP FLAG SET 5,(HL) RES 4,(HL) ;KILL POSSIBLE SCAN DOWN FLAG JP KYSWRT ;DONE ; ; KYSPC9 LD HL,RXSTAT ;SET THE SCAN DOWN FLAG SET 4,(HL) RES 5,(HL) ;KILL POSSIBLE SCAN UP FLAG JP KYSWRT ;DONE ;THESE ARE THE SPECIAL MONITOR ROUTINES. THE FIRST IS THE DISPATCH ;VECTORING ROUTINE. THE REST ARE THE DISPATCH ROUTINES THEMSELVES. ; KYMON LD HL,MONTBL ;POINT TO THE DISPATCH ADDRESS TABLE LD A,B ;GET THE SWITCH NUMBER RLCA CALL ADC LD E,(HL) ;GET DISPATCH ROUTINE ADDRESS TO HL INC HL LD D,(HL) EX DE,HL JP (HL) ;JUMP INTO DISPATCH ROUTINE ; ; KYMON0 LD HL,(MONDAT+1) ;DEPOSIT DISPLAYED DATA INTO DISPLAYED ADDR LD A,(MONDAT) LD (HL),A JR MONDB ;GO SET SPECIAL STATUS FLAG ; ; KYMON1 LD HL,MONDAT+2 ;TUNE UPPER ADDRESS JR MONDA ; ; KYMON2 LD HL,MONDAT+1 ;TUNE LOWER ADDRESS JR MONDA ; ; KYMON3 LD HL,MONDAT ;TUNE DATA MONDA LD (MONPNT),HL ;SAVE TUNE POINTER MONDB LD HL,RXSTAT ;SET MONITOR ACTIVE FLAG SET 7,(HL) LD HL,(MONDAT+1) ;UPDATE THE DATA DISPLAY LD A,(HL) LD (MONDAT),A LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ; ; KYMON4 LD HL,TMPWRK ;DISPLAY PORT DATA LD (HL),'P' ;INDICATE PORT DATA TO USER INC HL LD (HL),' ' INC HL EX DE,HL ;LOAD PORT ADDRESS FOR USER IN HEX LD HL,MONDAT+1 LD A,(HL) CALL PRHEX LD C,(HL) ;LOAD PORT DATA IN HEX IN A,(C) CALL PRHEX EX DE,HL LD (HL),' ' INC HL LD (HL),' ' INC HL LD B,8 ;BREAK OUT PORT DATA INTO BINARY FOR USER 5$ LD D,'0' ;SET UP BINARY ASCII 0 RLC C ;TEST DATA MSB JR NC,10$ ;BRANCH AND PRINT 0 IF NEEDED INC D ;ELSE CONVERT TO 1 10$ LD (HL),D INC HL DJNZ 5$ ;DO ALL 8 BITS LD HL,TMPWRK ;DISPLAY FINAL STRING RESULTS LD C,8FH LD B,16 CALL PRINT LD C,0 ;KILL DEFERRED FUNCTIONS JP KYSWRT ;DONE ; ; KYMON6 LD HL,MSVDSP ;A/D DATA DISPLAY ROUTINE LD A,(MSVOLT) ;ISOLATE BITE GEN CONTROL BITS FROM AND 38H ; CONTROL WORD, AND AUGMENT INTO DISPLAY CALL ADC ; TABLE LD DE,BITFMT+9 ;COPY MESSAGE INTO DISPLAY BUFFER LD BC,7 ; (USE BITE DISPLAY BUFFER, ITS NOT LDIR ; BEING USED HERE) LD A,(PORT96) ;USE OTHER DATA FROM PORT 96 (DETECTOR) AND 0BAH OR (HL) ;ADD IN TABLE SIG GEN CONTROL BITS OUT (96H),A ;SET UP HARDWARE LD HL,MSVLBL ;LABEL MEASURED SIGNAL ON DISPLAY LD A,(MSVOLT) AND 7 LD B,A RLCA RLCA ADD A,B CALL ADC LD DE,BITFMT LD BC,4 LDIR LD C,(HL) ;USE BIT MASK FROM LABEL TABLE AND CALL DACCVT ; CONVERT DATA LD L,A ;MULTIPLY DATA BY 4 TO GET VOLTS FORMAT LD H,0 ; THEN CONVERT TO BCD ADD HL,HL ADD HL,HL CALL BINBCD DEC HL ;DISPLAY MSD'S SUB A RLD LD A,'1' ;BRANCH AND DISPLAY 10 VOLTS IF MSD NOT 0 JR NZ,5$ LD A,' ' ;ELSE BLANK 10 VOLT DIGIT 5$ LD (DE),A INC DE SUB A ;DISPLAY VOLTAGE UNITS DIGIT RLD ADD A,'0' LD (DE),A INC DE LD A,'.' ;DISPLAY DECIMAL POINT LD (DE),A INC DE DEC HL ;POINT TO FRACTIONAL VOLTAGE DIGITS SUB A ;DISPLAY BOTH DIGITS RLD ADD A,'0' LD (DE),A INC DE SUB A RLD ADD A,'0' LD (DE),A LD HL,BITFMT ;DISPLAY COMPLETED STRING LD B,16 LD C,8FH CALL PRINT 10$ CALL UNBUTN ;WAIT FOR ALL SWITCHES RELEASED LD B,4 ;PAUSE 400 MS BETWEEN SAMPLES 15$ LD A,200 ; BUT SAMPLE SWITCHES EVERY 100 MS LD (TIMER),A 20$ LD A,(TIMER) AND A JR NZ,20$ IN A,(0) ;EXIT SWITCH PRESSED (9) ? BIT 1,A JR Z,50$ ;BRANCH IF YES IN A,(1) ;TEST OTHER SWITCHES CP 0FFH JR NZ,25$ ;BRANCH IF SWITCH PRESSED DJNZ 15$ ;ELSE COMPLETE PAUSE JP KYMON6 ;GO FOR NEXT SAMPLE 25$ LD HL,MSVOLT ;POINT TO CONTROL BYTE FOR SWITCHES BIT 2,A ;DUMP (0) ? JR NZ,30$ ;BRANCH IF NOT LD A,4 ;DUMP AGC LD (DMPTMR),A JR 10$ ;PAUSE AGAIN BEFORE NEXT SAMPLE 30$ BIT 5,A ;SIGNAL SELECT (1) ? JR NZ,35$ ;BRANCH IF NOT LD A,(HL) ;SELECT NEXT SIGNAL TO CONVERT INC A AND 7 LD B,A LD A,(HL) AND 0F8H OR B LD (HL),A JP KYMON6 ;GO AFTER NEW SAMPLE 35$ BIT 3,A ;MUTE CONTROL (2) ? JR NZ,40$ ;BRANCH IF NOT LD A,8 ;ELSE INVERT MUTE CONTROL XOR (HL) LD (HL),A JP KYMON6 ;GO AFTER NEW SAMPLE 40$ BIT 1,A ;SIG GEN LEVEL SELECT (3) ? JP NZ,KYMON6 ;IGNORE ALL SWITCHES IF NOT, TAKE NEW SAMPLE LD A,(HL) ;UPDATE SIG GEN LEVEL ADD A,10H CP 30H JR C,45$ AND 0FH 45$ LD (HL),A JP KYMON6 ;TAKE NEW SAMPLE 50$ CALL UNBUTN ;EXIT REQUESTED (9) LD C,3 ;SET UP HARDWARE AND DISPLAYS POSTHUMOUSLY JP KYSWRT ;DONE ; ; KYMON7 SUB A ;PANIC BUTTON-- RESET RX WITH DEFAULT VALUES LD (RAMCPT),A JP START ; ; KYMON8 LD HL,VERMSG ;DISPLAY THE PROGRAM NUMBER AND VERSION LD C,8FH LD B,16 CALL PRINT LD C,0 ;KILL DEFERRED FUNCTIONS BITS JP KYSWRT ;DONE ; ; KYMON9 LD HL,RXSTAT ;CLEAR THE MONITOR FLAG RES 7,(HL) LD C,3 ;REQUEST SETRCR AND SETDSP JP KYSWRT ;DONE ;THIS ROUTINE SETS UP THE RECEIVER HARDWARE ; SETRCR CALL SETUP ;PRE-PROCESS DETECTOR / FILTER MATRIX SOLUTION CALL SETFRQ ;SET UP FIRST LO CALL SETBFO ;SET UP BFO CALL SETDET ;SET UP DETECTOR CALL SETFIL ;SET UP FILTER CALL SETAGC ;SET UP AGC CALL SETCP ;SET UP AUDIO CROSSPOINT SWITCH RET ;DONE ;THIS ROUTINE EXAMINES THE DETECTOR AND FILTER VALUES, AND LOADS FILSCR ;(FILTER SCRATCHPADS) WITH PROPER VALUES TO BE USED LATER BY SETFRQ, SETBFO, ;AND SETFIL. THE VALUES REPRESENT THE MATRIX SOLUTION TO THE VARIABLES OF ;SYMMETRICAL VERSUS ASYMMETRICAL FILTER TYPE, AND SIDEBAND VERSUS NON-SIDEBAND ;DETECTOR MODE. IN THE END, FILSCR WILL BE LOADED WITH THE PROPER HARDWARE ;PHYSICAL FILTER SLOT NUMBER (0-5) TO BE USED (IN ISB, THE USB FILTER IS ;LOADED AS THE LSB FILTER IS ASSUMED TO BE FL1), AND FILSCR+1 WILL BE LOADED ;WITH A NUMBER (0-11) ACCORDING TO THE FOLLOWING MATRIX: ; ; DETECTOR TYPE: ; AM,FM,CW LSB USB ISB ; -------- --- --- --- ; ; FILTER: SYMM. (TYPE 0) 0 1 2 3 ; LSB (TYPE 1) 4 5 6 7 ; USB (TYPE 2) 8 9 10 11 ; ;THE OUTPUT FROM THIS MATRIX WILL BE USED BY SETFRQ AND SETBFO TO CALCULATE ;THE PROPER SYNTHESIZER OFFSETS REQUIRED FOR PROPER OPERATION BY USING A ;SEPARATE TABLE, INDEXED BY THE NUMBERS FROM THIS MATRIX. ; SETUP LD HL,RXSTAT+2 ;TEST, BRANCH IF OVERRIDE MODE BIT 2,(HL) JR NZ,35$ LD A,(DETECT) ;TEST DETECTOR AND A JR Z,5$ ;BRANCH IF ISB-U CP 5 JR Z,5$ ;BRANCH IF ISB-L CP 6 ;SELECT USERS FILTER IF AM, FM, OR CW LD A,(FILTER) JR C,20$ LD A,0B4H ;SET UP LSB TEST BYTE JR Z,10$ ;BRANCH IF LSB 5$ LD A,0B8H ;ELSE TEST USB 10$ CALL COUNT ;FIND IF SSB FILTER INSTALLED, AND WHERE LD A,B JR NZ,20$ ;BRANCH IF FOUND 15$ LD A,1 ;ELSE DEFAULT TO FL1 20$ LD (FILSCR),A ;SAVE FILTER SLOT NUMBER FOR USE BY SETFIL LD HL,FILTAB ;FIND OUT FILTER TYPE FROM FILTAB LD C,A ;TRIPLE AND ADD AUGMENT RLCA ADD A,C CALL ADC LD A,(HL) CP 0B4H ;ASSIGN 0 TO SYMMETRICAL FILTER, 4 TO LSB LD C,0 ; FILTER, OR 8 TO USB FILTER JR C,25$ LD C,4 JR Z,25$ LD C,8 25$ LD A,(DETECT) ;NOW CHECK THE DETECTOR TYPE LD HL,DETTYP ; (0=AM,FM,CW 1=LSB 2=USB 3=ISB) CALL ADC LD A,(HL) OR C ;MIX WITH THE FILTER TYPE 30$ LD (FILSCR+1),A ;SAVE RESULT FOR SETFRQ AND SETBFO USE RET ;DONE ; 35$ LD A,(FILTER) ;OVERRIDE-- USE FILTER DEFINED BY REMOTE SYSTEM LD (FILSCR),A SUB A ;FORCE NON-OFFSET MAIN LO AND BFO FREQUENCIES JR 30$ ;THIS ROUTINE SETS UP THE FIRST LO WITH THE RECEIVER WORKING FREQUENCY. ;FILSCR+1 MUST HAVE BEEN PREVIOUSLY SET UP VIA SETUP. ;ENTRY AT SETFRQ ALLOWS LARGE FREQUENCY EXCURSIONS. LOCAL TUNING ENTRY ;IS AT SETF1. ; SETFRQ LD A,17 ;LOAD OUTPUT COUNTER LD (SETFCT),A LD DE,TMPWRK ;LOAD START OF BUFFER LD A,1BH ;CLEAR CTRL1 (D1) USED FOR EXT LATCH CONTROL LD (DE),A ;CLEAR CTRL2 (D2) USED FOR EXT LATCH RESET INC DE LD A,16H ;POINT TO SYNTHESIZER INT REG ADDRESS 6 LD (DE),A INC DE LD A,(FRQWRK+3) ;CONVERT 10,1 MHZ DIGITS FROM BCD TO BINARY BIT 4,A ; FOR USE AS SYNTHESIZER DAC CONTROL JR Z,5$ ;BRANCH IF "10" DIGIT NOT SET RES 4,A ;ELSE CLEAR IT AND ADD 10 BINARY IN ITS PLACE ADD A,10 5$ BIT 5,A ;"20" SET ? JR Z,10$ ;BRANCH IF NOT RES 5,A ;ELSE CLEAR IT AND ADD 20 BINARY IN ITS PLACE ADD A,20 10$ LD HL,SYNDAC ;GET SYNTH DAC CONTROL BITS AS FUNCTION OF FREQ CALL ADC LD A,(HL) ;OUTPUT DAC CONTROL BITS FOR SYNTHESIZER EXT AND 0FH ; DAC CONTROL LATCH LD (DE),A INC DE LD A,(HL) ;THEN OUTPUT OSC SELECT AND BANDWIDTH SEL BITS CALL SHFTR4 LD (DE),A INC DE LD A,1BH ;STROBE IN DATA TO SYNTH INT LATCHES SO DAC LD (DE),A ; BITS ETC EMERGE AT 10,1 MHZ PINS INC DE JR SETF2 SETF1 LD A,11 ;LOAD COUNTER FOR OUTPUT LD (SETFCT),A LD DE,TMPWRK ;LOAD START OF BUFFER SETF2 LD HL,LOFSET ;POINT TO LO OFFSET TABLE LD A,(FILSCR+1) ;FETCH DETECTOR / FILTER TYPE INDICATOR CALL ADC ;AUGMENT TABLE POINTER LD C,(HL) ;GET CORRECT LO OFFSET BYTE TO C FROM TABLE LD A,19H ;STROBE EXT OCTAL LATCH TO REMEMBER VALUES LD (DE),A ;NOW PREPARE TO SEND FREQ DATA TO SYNTHESIZER INC DE LD A,17H ;FEED THE SYNTHESIZER THE APPETIZER LD (DE),A INC DE LD HL,FRQWRK ;NOW FOR THE MAIN COURSE LD A,(HL) AND 0FH LD (DE),A ;1 HZ INC DE LD A,(HL) CALL SHFTR4 LD (DE),A ;10 HZ INC DE INC HL LD A,(HL) ADD A,C ;ADD TABLE IF OFFSET SAVED IN C DAA RL C ;SAVE CARRY IN C TEMP LD B,A AND 0FH LD (DE),A ;100 HZ INC DE LD A,B CALL SHFTR4 LD (DE),A ;1 KHZ INC DE INC HL LD A,(HL) RR C ;RESTORE CARRY ADC A,45H DAA RL C ;SAVE NEW CARRY LD B,A AND 0FH LD (DE),A ;10 KHZ INC DE LD A,B CALL SHFTR4 LD (DE),A ;100 KHZ INC DE INC HL LD A,(HL) RR C ADC A,0 DAA LD B,A ;TRANSFORM MHZ DIGITS TO QUASI-MOD5 AND 0F0H ;WITH 65 BCD OFFSET FOR SYNTHESIZER ADD A,B ;DOUBLE 10 MHZ DIGIT ADD A,5 ;ADD INITIAL 5 DAA LD B,A AND 0FH ;CHECK 1 MHZ DIGIT JR Z,5$ ;BRANCH IF ZERO CP 5 JR C,10$ ;BRANCH IF 1-4 JR NZ,5$ ;BRANCH IF 6-9 SUB A ;MUST BE 5 ADD NOTHING JR 15$ 5$ LD A,5 ;ADD 5 BCD FOR 1 MHZ DIGIT =0 OR 6-9 JR 15$ 10$ LD A,10H ;ADD 10 BCD FOR 1 MHZ DIGIT =1-4 15$ ADD A,B ;ADD IN CORRECTION FACTOR DAA ADD A,60H ;ADD IN FINAL 60 (BINARY) LD B,A AND 0FH ;OUTPUT MHZ DIGIT LD (DE),A ;1 MHZ INC DE LD A,B CALL SHFTR4 LD (DE),A ;10 MHZ INC DE LD A,(SETFCT) ;GET OUTPUT COUNTER CP 17 ;DO WE WANT TO RESET THE SYNTHESIZER JR NZ,20$ ;BRANCH IF NOT LD A,1DH ;RESET THE SYNTHESIZER LD (DE),A INC DE 20$ LD A,19H ;NOW FEED THE SYNTHESIZER DESSERT LD (DE),A LD HL,PORT5 ;OPEN QUIET BUS RES 6,(HL) LD A,(HL) OUT (5),A LD HL,TMPWRK ;ZAP OUT DATA LD C,90H ; LOAD OUTPUT PORT LD A,(SETFCT) ; GET NUMBER OF BYTES LD B,A ; PUT INTO COUNTER OTIR ; DO IT LD HL,PORT5 ;CLOSE THE QUIET BUS SET 6,(HL) LD A,(HL) OUT (5),A LD A,20 ;SET OOL TIMER FOR 10 MS LD (OOLTMR),A RET ;DONE ;THIS ROUTINE SETS UP THE BFO SYNTHESIZER. FILSCR+1 MUST HAVE BEEN PREVIOUSLY ;SET UP VIA SETUP. ; SETBFO LD HL,BFOFST ;POINT TO BFO OFFSET TABLE LD A,(FILSCR+1) ;FETCH DETECTOR / FILTER TYPE INDICATOR CALL ADC ;AUGMENT TABLE POINTER LD C,(HL) ;GET CORRECT BFO OFFSET BYTE TO C FROM TABLE LD HL,BCDWRK+3 ;INITIALIZE WORKING REGISTERS WITH ZERO BFO SUB A LD (HL),A DEC HL LD (HL),A DEC HL LD (HL),A DEC HL LD (HL),A LD A,(DETECT) ;BFO VARIABLE DETECTOR MODE ? CP 3 JR NZ,5$ ;BRANCH IF NOT LD A,(BFOWRK) ;UPDATE WORKING REGISTERS WITH CORRECT BFO DATA LD (BCDWRK+1),A LD A,(BFOWRK+1) LD (BCDWRK+2),A INC HL ;SHIFT UP BFO OFFSET (MAKES BFO LOOK LIKE 100X SUB A ; ACTUAL BFO FREQUENCY) RLD INC HL RLD INC HL RLD BIT 3,(HL) ;POSITIVE BFO ? JR Z,5$ ;BRANCH IF YES LD A,90H ;ELSE SIGN EXTEND NEGATIVE BFO (10'S COMPL) ADD A,(HL) LD (HL),A 5$ LD HL,BCDWRK+2 ;ADD IN CORRECT BFO OFFSET LD A,(HL) ADD A,C ;ADD IN 1 KHZ, 100 HZ FROM OFFSET TABLE DAA LD (HL),A INC HL LD A,(HL) ;NOW ADD IN CONSTANT UPPER MSD'S ADC A,18H DAA LD (HL),A LD D,2 ;NOW DIVIDE 100 X FREQ BY 4 (2 TWICE) 10$ LD HL,BCDWRK+3 ;POINT TO TOP OF STRING (MSD'S) LD B,4 ;SET COUNTER FOR 4 BYTES (8 DIGITS) AND A ;CLEAR INITIAL CARRY 15$ LD A,(HL) ;GET PACKED BCD BYTE RR A ;SHIFT IT DOWN WITH LAST BYTE'S LSB (IN CARRY) RL C ;SAVE THIS BYTE'S SHIFTED OUT LSB IN C BIT 7,A ;"1" SHIFTED INTO MSB ? JR Z,20$ ;BRANCH IF NOT SUB 30H ;ELSE CORRECT UPPER NIBBLE 20$ BIT 3,A ;"1" SHIFTED INTO LOWER NIBBLE ? JR Z,25$ ;BRANCH IF NOT SUB 3 ;ELSE CORRECT LOWER NIBBLE 25$ LD (HL),A ;SAVE BACK THIS BYTE DEC HL ;POINT TO NEXT BYTE RR C ;RESTORE SHIFT-OUT BACK INTO CARRY FROM C DJNZ 15$ ;DO ALL BYTES DEC D ;DO DIVIDE TWICE (DIV 2 TWICE = DIV 4) JR NZ,10$ LD HL,PORT5 ;NOW OUTPUT RESULTS TO BFO SYNTHESIZER RES 6,(HL) ;TURN ON THE QUIET BUS LD A,(HL) OUT (5),A LD A,10H ;TURN ON THE SYNTHESIZER INPUT BUFFER OUT (91H),A SUB A ;FORCE 0 10 HZ DIGIT, IGNORE 1 HZ DIGIT OUT (91H),A LD B,3 ;OUTPUT 100 HZ THRU 10 MHZ DIGITS IN LOOP LD HL,BCDWRK+1 30$ LD A,(HL) ;OUTPUT LOWER DIGIT AND 0FH OUT (91H),A LD A,(HL) ;THEN UPPER DIGIT CALL SHFTR4 OUT (91H),A INC HL DJNZ 30$ ;DO ALL DIGITS SUB A ;OUTPUT 0 100 MHZ DIGIT OUT (91H),A LD A,19H ;CLOSE OFF SYNTH INPUT BUFFER AND TRANSFER OUT (91H),A ; IN DATA LD HL,PORT5 ;CLOSE THE QUIET BUS SET 6,(HL) LD A,(HL) OUT (5),A LD A,200 ;SET THE OOL TIMER FOR 100 MS LD (OOLTMR),A RET ;DONE ;THIS ROUTINE SETS UP THE PROPER HARDWARE FILTER. FILSCR MUST ALREADY BE ;SET UP VIA "SETUP". ; SETFIL LD B,1 ;PRESET B FOR FL1 ADD-IN IN CASE ISB DETECTOR LD A,(DETECT) AND A JR Z,5$ ;BRANCH IF ISB-U CP 5 JR Z,5$ ;BRANCH IF ISB-L LD B,0 ;NOT ISB-- KILL FL1 ADD-IN 5$ LD HL,CVTFIL ;CONVERT FILTER SLOT NUMBER TO HARDWARE LD A,(FILSCR) ; CONFIGURATION CODE USING SLOT NUMBER CALL ADC ; PREVIOUSLY CALCULATED BY "SETUP" LD A,(PORT5) ;GET PORT IMAGE, KEEP QUIET BUS CONTROL BIT AND 40H OR (HL) ;ADD IN HARDWARE SELECT LINE FROM CONV TABLE OR B ;ADD IN POSSIBLE FL1 SLOT IN CASE ISB DETECTOR LD (PORT5),A ;SAVE BACK NEW IMAGE OUT (5),A ;OUTPUT TO HARDWARE RET ;DONE ;THIS ROUTINE SETS UP THE PROPER HARDWARE DEMODULATOR ; SETDET LD HL,CVTDET ;POINT TO CONVERSION TABLE LD A,(DETECT) ;GET DETECTOR CALL ADC ;AUGMENT TABLE POINTER LD A,(PORT96) ;UPDATE PORT IMAGE WITH NEW DETECTOR HARDWARE AND 0C7H ; CONFIGURATION OR (HL) LD (PORT96),A OUT (96H),A ;OUTPUT NEW CONFIGURATION TO HARDWARE RET ;DONE ;THIS ROUTINE HANDLES THE MAIN AND ISB (IF INSTALLED) AGC SET-UP ; SETAGC LD A,(AGC) ;GET LOGICAL AGC TO D LD D,A AND 7 ;CONVERT MAIN AGC TO HARDWARE CONFIGURATION, LD HL,CVTAGC ; AND SAVE IN B CALL ADC LD B,(HL) LD A,D ;CONVERT ISB AGC TO HARDWARE CONFIGURATION AND AND 1CH ; SAVE IN C LD C,A RLCA CALL SHFTR4 OR C AND 7 LD HL,CVTAGC CALL ADC LD C,(HL) LD A,(RXSTAT) ;GET REMOTE FLAG TO E LD E,A LD A,0FFH ;PRESET MAX DAC VALUE BIT 0,E JR Z,5$ ;BRANCH IF LOCAL BIT 2,D ;BRANCH IF MODE IS NON-MANUAL TYPE JR Z,5$ LD A,B ;ELSE INVERT MAIN AND ISB AGC VOLTAGE CONTROL XOR 50H LD B,A LD A,C XOR 50H LD C,A LD A,(MGCLVL) ;USE REMOTE MGC CONTROL VOLTAGE FOR DAC 5$ LD (DACLVL),A ;LOAD DAC CONTROL STORAGE LD A,B ;UPDATE MAIN AGC CONTROL STORAGE LD (PORT92),A CALL TSTISB ;BRANCH IF ISB NOT INSTALLED JR NZ,15$ LD A,(DETECT) ;ISB INSTALLED-- USE MAIN AGC CONTROL FOR ISB CP 6 ; PATH IF DETECTOR SET FOR LSB LD A,C JR NZ,10$ LD A,B 10$ SRL A ;POSITION ISB AGC AND SAVE LD (PORT97),A 15$ LD A,D ;TEST, BRANCH IF MGC (REMOTE OR LOCAL) CP 4 JR Z,20$ BIT 0,E ;BRANCH IF LOCAL JR Z,25$ LD A,(RXSTAT+2) ;REMOTE-- TEST DUMP INHIBIT FLAG, BRANCH IF BIT 7,A ; DUMP ALLOWED JR Z,25$ 20$ LD A,(DACLVL) ;SET UP AGC HARDWARE IMMEDIATELY, DO NOT OUT (2),A ; SET DUMP TIMER LD A,(PORT92) OUT (92H),A CALL TSTISB ;DONE IF ISB NOT INSTALLED RET NZ LD A,(PORT97) ;ELSE SET UP ISB AGC HARDWARE OUT (97H),A RET ;DONE 25$ LD A,4 ;SET DUMP TIMER, DEFER AGC HARDWARE SET-UP LD (DMPTMR),A ; 'TIL LATER RET ;DONE ;THIS ROUTINE SETS UP THE AUDIO CROSSPOINT SWITCH AS A FUNCTION OF THE DETECTOR ; SETCP CALL TSTISB ;GET DETECTOR, BRANCH IF ISB NOT INSTALLED LD A,(DETECT) JR NZ,5$ CP 6 ;BRANCH IF NOT LSB MODE JR NZ,5$ LD A,8 ;ELSE CONVERT DETECTOR TO LSB ,ISB INSTALLED 5$ RLCA ;GET CP BITS TO HL VIA DETECT VALUE FROM TABLE LD HL,AUDCP CALL ADC LD E,(HL) INC HL LD D,(HL) EX DE,HL LD A,(PORT5) ;OPEN THE QUIET BUS RES 6,A OUT (5),A LD B,16 ;LOAD 16 CP SWITCH BITS 10$ LD A,B ;COPY AND CORRECT CP ADDRESS FOR THIS BIT SUB 1 ADD HL,HL ;TEST BIT JR NC,15$ ;BRANCH IF BIT NOT SET SET 4,A ;ELSE SET OUTPUT BIT WITH ADDRESS 15$ OUT (93H),A ;OUTPUT CP DATA BIT WITH ADDRESS DJNZ 10$ ;GO AFTER NEXT BIT LD A,(PORT5) ;TURN OFF THE QUIET BUS SET 6,A OUT (5),A RET ;DONE ;THIS ROUTINE SETS UP THE RECEIVER DISPLAYS ; SETDSP LD HL,(MONDAT+1) ;UPDATE THE MONITOR DATA LD A,(HL) LD (MONDAT),A SUB A ;BRANCH WITH 0 IF MONITOR MODE LD HL,RXSTAT BIT 7,(HL) JR NZ,10$ LD A,(FFSCR) ;BRANCH WITH 10 IF FORCE FILTER MODE AND A LD A,10 JR NZ,10$ LD HL,RXSTAT+2 ;BRANCH WITH 9 IF OVERRIDE MODE LD A,9 BIT 2,(HL) JR NZ,10$ LD A,(RXSTAT+1) ;OOL ERRORS ? AND 0FH JR Z,5$ ;BRANCH IF NOT LD HL,TBLINK ;BLINK TIME ? BIT 4,(HL) LD A,1 ;PRESET OOL ADDRESS INDEX IF YES JR NZ,10$ ;BRANCH IF YES 5$ LD A,(MODEWD) ;GET THE MODE WORD X2 10$ RLCA LD HL,DSPTBL ;AUGMENT IN SERVICE ROUTINE TABLE CALL ADC LD E,(HL) ;MOVE SERVICE ROUTINE ADDRESS INTO HL INC HL LD D,(HL) EX DE,HL JP (HL) ;JUMP INTO SERVICE ROUTINE ; ; ;MOST DISPLAY ROUTINES RETURN HERE WHEN DONE TO PRINT THEIR RESULTS ; DSPRET LD C,8BH ;PRINT MAIN DISPLAY MESSAGE LD B,9 CALL PRINT LD HL,REMMSG ;PRINT LOCK (LOK), REMOTE (REM) MESSAGE FIELD LD A,(RXSTAT) ;REMOTE MODE ? BIT 0,A JR NZ,15$ ;BRANCH IF YES TO PRINT REMOTE MESSAGE LD HL,LOKMSG LD A,(TUNCTR) ;GET TUNE CONTROL WORD FOR TESTING LD B,A LD A,(MODEWD) ;TEST MODE WORD CP 5 ;BRANCH IF NOT FREQ MODE JR NZ,5$ BIT 2,B ;FREQ TUNING LOCKED ? JR NZ,15$ ;BRANCH IF YES, PRINT LOCKED MESSAGE JR 10$ ;ELSE PRINT BLANK FIELD 5$ CP 6 ;BRANCH IF NOT CW VARIABLE DETECTOR MODE JR NZ,10$ LD A,(DETECT) CP 3 JR NZ,10$ BIT 6,B ;BFO TUNING LOCKED ? JR NZ,15$ ;BRANCH IF YES, DISPLAY LOCKED MESSAGE 10$ LD HL,BLANKS ;ELSE PRINT A BLANK MESSAGE 15$ LD C,82H ;PRINT THE MESSAGE FIELD LD B,3 CALL PRINT ; DSPRT1 LD A,(MODEWD) ;PRINT MODE MESSAGE RLCA RLCA LD HL,MODMSG CALL ADC LD C,8FH LD B,4 CALL PRINT RET ;DONE ; ; ;THIS ROUTINE DISPLAYS THE METER SELECTION MESSAGES ; PRMETR LD HL,RXSTAT ;WHICH METER FOR DISPLAY ? BIT 6,(HL) LD HL,AFMSG ;POINT TO AUDIO MESSAGE JR NZ,5$ ;BRANCH IF AUDIO LD HL,RFMSG ;ELSE DISPLAY RF MESSAGE 5$ JR DSPRET ;GO FINISH UP ; ; ;THIS ROUTINE DISPLAYS THE FILTER VALUE ; PRFILT LD A,(FILTER) ;GET FILTER NUMBER CALL FMTFIL ;FORMAT FOR DISPLAY JR DSPRET ;GO FINISH UP ; ; ;THIS ROUTINE DISPLAYS THE AGC PARAMETERS ; PRAGC LD HL,AGCFMT ;POINT TO CANNED AGC FORMAT MESSAGES LD A,(DETECT) ;USE MAIN AGC UNLESS ISB-L, THEN USE ISB AGC CP 5 LD A,(AGC) JR NZ,5$ AND 1CH ;ISB-L -- ISOLATE ISB AGC FOR USE LD B,A RLCA CALL SHFTR4 ;POSITION ISB AGC OR B ;ADD IN MGC BIT 5$ AND 7 ;ISOLATE ONLY AGC PART OF INTEREST LD B,A RLCA RLCA RLCA ADD A,B CALL ADC ;POINT TO CANNED MESSAGE FOR DISPLAY JP DSPRET ;GO FINISH UP ; ; ;THIS ROUTINE HANDLES THE FREQUENCY DISPLAYS ; PRFREQ LD A,(FRQPTR) ;DETERMINE WHICH FREQUENCY DISPLAY IS NEEDED AND A ;BRANCH IF FREQUENCY ENTRY ACTIVE JR NZ,25$ LD B,4 ;ELSE DISPLAY FREQUENCY DATA-- SET LOOP COUNTER LD DE,FRQWRK ;POINT TO FREQ STORAGE LD HL,TMPWRK+8 ;LOAD INTO TEMP STORAGE 5$ LD A,(DE) ;GET THE LOWER NIBBLE AND 0FH ;MAKE ASCII ADD A,'0' LD (HL),A ;SAVE IT DEC HL LD A,(DE) ;GET UPPER NIBBLE CALL SHFTR4 ;MAKE ASCII ADD A,'0' LD (HL),A ;SAVE IT INC DE ;UPDATE POINTERS DEC HL LD A,B ;TIME FOR DECIMAL POINT YET ? CP 2 JR NZ,10$ ;BRANCH IF NOT LD (HL),'.' ;ELSE PRINT DECIMAL POINT DEC HL 10$ DJNZ 5$ ;DO ALL FREQ BYTES LD A,(TUNCTR) ;CHECK TUNE RATE AND 0FH CP 2 JR C,20$ ;BRANCH IF FINE TUNING CP 3 LD A,' ' ;SET UP SPACE FOR MEDIUM OR FAST JR C,15$ ;BRANCH FOR MEDIUM JR NZ,20$ ;BRANCH IF NOT FAST LD (TMPWRK+7),A ;KILL 10 HZ DISPLAY FOR FAST 15$ LD (TMPWRK+8),A ;KILL 1 HZ DISPLAY FOR FAST AND MEDIUM 20$ INC HL ;POINT TO START OF FREQUENCY DATA MESSAGE JP DSPRET ;GO FINISH UP 25$ LD HL,FRQDSP ;DISPLAY FREQ BEING ENTERED LD C,8BH LD B,12 CALL PRINT JP DSPRT1 ;GO FINISH UP ; ; ;THIS ROUTINE DISPLAYS THE DETECTOR PARAMETERS. ;IT ALSO DISPLAYS THE BFO DATA IF IN CW MODE. ; PRDET LD HL,DETFMT ;POINT TO CANNED DETECTOR FORMAT MESSAGES LD A,(DETECT) ;AUGMENT POINTER WITH 9X DETECTOR VALUE LD B,A RLCA RLCA RLCA ADD A,B CALL ADC LD A,B ;CW VARIABLE MODE ? CP 3 JR NZ,10$ ;BRANCH IF NO, DONE LD DE,TMPWRK ;ELSE COPY STRING INTO EDITTING BUFFER LD BC,9 LDIR LD A,(BFOWRK) ;GET BFO DATA FOR DISPLAY LD B,A LD A,(BFOWRK+1) BIT 7,A ;ALREADY POSITIVE BFO ? JR Z,5$ ;BRANCH IF YES LD C,A ;ELSE NEGATE NEGATIVE BFO TO MAKE POSITIVE LD A,'-' ;REPLACE "+" IN CANNED MESSAGE WITH "-" LD (TMPWRK+3),A SUB A SUB B DAA LD B,A LD A,0 SBC A,C DAA 5$ ADD A,'0' ;DISPLAY FIRST DIGIT IN ASCII LD (TMPWRK+4),A LD A,B ;DISPLAY SECOND DIGIT CALL SHFTR4 ADD A,'0' LD (TMPWRK+6),A LD A,B ;DISPLAY THIRD DIGIT AND 0FH ADD A,'0' LD (TMPWRK+7),A LD HL,TMPWRK ;POINT TO MAIN MESSAGE 10$ JP DSPRET ;GO FINISH UP ; ; ;THESE ROUTINES DISPLAY THE REFERENCE SELECTION DATA. THE FIRST DISPLAYS ;WHETHER IT IS EXTERNAL OR INTERNAL. THE SECOND DISPLAYS THE EXTERNAL REF ;VALUE SELECTION (1, 5, 10 MHZ). ; PRREFS LD A,(PORT94) ;ISOLATE THE EXT / INT REF FLAG BIT AND 1 JR PRREF ;GO FINISH UP ; PRREFV LD A,(PORT94) ;ISOLATE AND POSITION THE REF VALUE BITS RRCA AND 3 ADD A,2 ;ADD IN TABLE OFFSET ; PRREF LD B,A ;MULTIPLY REF MESSAGE SELECT NUMBER X9 RLCA RLCA RLCA ADD A,B LD HL,REFMSG ;AUGMENT REF MESSAGE POINTER FOR DISPLAY CALL ADC JP DSPRET ;GO FINISH UP ; ; ;THIS ROUTINE PRINTS THE OVERRIDE MESSAGE ; PROVRD LD HL,OVRMSG ;OVERRIDE MODE-- TELL OPERATOR LD C,8FH LD B,16 CALL PRINT RET ;DONE ; ; ;THIS ROUTINE DISPLAYS THE OOL ERRORS ; PRFALT LD A,(RXSTAT+1) ;TEST WHICH OOL LD HL,REFOOL ;BRANCH IF REF BIT 1,A JR NZ,5$ LD HL,LOOOL ;BRANCH IF 1ST LO BIT 0,A JR NZ,5$ LD HL,BASOOL ;BRANCH IF BASEBAND CONVERTER BIT 3,A JR NZ,5$ LD HL,BFOOOL ;ELSE MUST BE BFO 5$ LD B,12 ;PRINT FAULT MESSAGE LD C,8BH CALL PRINT RET ;DONE ; ; ;THIS ROUTINE DISPLAYS THE MONITOR DATA ; PRMON LD HL,MONDAT+2 ;GET MONITOR DATA TO TMPWRK IN ASCII LD DE,TMPWRK LD B,3 ;3 BYTES WORTH 5$ LD A,(HL) CALL PRHEX DEC HL DJNZ 5$ LD HL,(MONDAT+1) ;APPEND 3 SUCCESSIVE BYTES AFTER DATA BYTE LD B,3 10$ LD A,' ' ;SEPARATE EACH BYTE WITH A SPACE LD (DE),A INC DE INC HL LD A,(HL) CALL PRHEX DJNZ 10$ LD A,' ' ;FINISH STRING WITH A FINAL SPACE LD (DE),A LD HL,TMPWRK ;PRINT MONITOR DATA LD C,8FH LD B,16 CALL PRINT RET ;DONE ; ; ;THIS ROUTINE DISPLAYS THE FORCE FILTER VALUE OF THE FILTER UNDER REVIEW ; PRFORF LD A,(FFSCR) ;ISOLATE FILTER NUMBER AND 7 CALL FMTFIL ;FORMAT IT FOR DISPLAY AND PRINT IT LD C,8BH LD B,9 CALL PRINT LD HL,FFMSG ;LOAD FILTER NUMBER CANNED MESSAGE LD DE,TMPWRK LD BC,4 LDIR LD A,(FFSCR) ;FINISH IT WITH FILTER NUMBER AND 7 ADD A,'0' ;MUST MAKE IT ASCII LD (TMPWRK+2),A LD HL,TMPWRK ;PRINT IT LD C,8FH LD B,4 CALL PRINT RET ;DONE ; ; ;THIS ROUTINE EXAMINES THE FILTER TABLE FOR A SPECIFIC FILTER AND ;FORMATS IT FOR DISPLAY ; FMTFIL LD HL,FILTAB ;POINT TO FILTER IDENTIFIER TABLE LD B,A ;AUGMENT WITH 3X FILTER VALUE RLCA ADD A,B CALL ADC LD DE,TMPWRK+9 ;GET FILTER DATA AND STRETCH IT OUT PUSH DE LD B,3 5$ LD A,(HL) CALL SHFTR4 LD (DE),A INC DE LD A,(HL) AND 0FH LD (DE),A INC HL INC DE DJNZ 5$ POP HL ;FIND FIRST NON-ZERO ELEMENT LD B,6 10$ LD A,(HL) AND A JR NZ,15$ INC HL DJNZ 10$ 15$ CP 0BH ;SPECIAL FILTER TYPE ? JR C,20$ ;BRANCH IF NOT INC HL ;ELSE FIND OUT TYPE LD A,(HL) RRCA ;POSITION AND NORMALIZE VALUE (0-3) RRCA ADD A,7 ;CORRECT FOR TABLE POINTER (7-10) LD B,A 20$ LD A,B ;MULTIPLY FILTER TYPE X9 RLCA RLCA RLCA ADD A,B PUSH HL ;SAVE STRING POINTER TEMP LD HL,FILFMT ;LOAD CANNED FORMAT INTO WORKSPACE CALL ADC LD DE,TMPWRK LD BC,9 LDIR POP HL ;RETRIEVE STRING POINTER LD DE,TMPWRK ;TEST CANNED FORMAT 25$ LD A,(DE) CP 'X' JR Z,30$ ;BRANCH AND FILL IN NUMBER IF "X" CP '.' ;SKIP OVER DECIMAL POINTS JR Z,35$ JR 40$ ;DONE IF NEITHER "X" NOR "." 30$ LD A,(HL) ;GET NUMBER ADD A,'0' ;MAKE ASCII LD (DE),A ;REPLACE "X" INC HL 35$ INC DE ;GO AFTER NEXT "X" JR 25$ 40$ LD HL,TMPWRK ;POINT TO FINAL MAIN MESSAGE FOR DISPLAY RET ;DONE ; ; ;THIS ROUTINE LOADS A BUFFER POINTED TO BY DE WITH A BYTE OF DATA IN ;2 SUCCESSIVE LOCATIONS IN ASCII HEX FORM SUITABLE FOR DISPLAY ON THE ;FRONT PANEL. ; PRHEX LD C,A ;SAVE DATA IN C CALL SHFTR4 ;ISOLATE UPPER NIBBLE CP 10 ;CONVERT TO ASCII HEX JR C,5$ ADD A,7 5$ ADD A,'0' LD (DE),A ;LOAD INTO BUFFER INC DE ;ADJUST POINTER LD A,C ;ISOLATE AND LOAD LOWER NIBBLE IN ASCII HEX AND 0FH CP 10 JR C,10$ ADD A,7 10$ ADD A,'0' LD (DE),A INC DE RET ;DONE ; ; ;THIS IS THE STANDARD DISPLAY PRINT ROUTINE. ENTERED WITH HL POINTING TO ;STRING TO BE DISPLAYED, B CONTAINING THE NUMBER OF BYTES TO PRINT, AND ;C CONTAINING THE STARTING PORT ADDRESS ; PRINT LD A,(HL) ;GET CHARACTER OUT (C),A ;DISPLAY IT INC HL ;POINT TO NEXT CHARACTER NEEDED DEC C ;ADJUST PORT POINTER DJNZ PRINT ;DO ALL BYTES REQUESTED RET ;DONE ;THE FOLLOWING ROUTINE GETS THE METER SETTINGS ;FROM THE DAC. IF APPROPRIATE THE NEW DATA IS DISPLAYED ; DAC LD HL,DACCTL ;GET DAC CONTROL BIT LD A,(HL) INC A ;UPDATE POINTER CP 4 ;MAKE SURE WITHIN RANGE JR C,5$ ;BRANCH IF OK LD A,1 ;ELSE START FRESH WITH FIRST 5$ LD (HL),A ;SAVE BACK IN MEMORY CALL ADC ;FIX UP POINTER LD C,8 ;PICK A/D SELECT BIT-- TRY BIT 3 FOR ISB FIRST CP 2 JR C,10$ ;BRANCH IF ISB LD C,2 ;ELSE TRY BIT 1 FOR RF JR Z,10$ ;BRANCH IF RF LD C,1 ;ELSE FORCE BIT 0 FOR AUDIO 10$ CALL DACCVT ;DO A/D CONVERSION LD (HL),A ;SAVE RESULT LD HL,RXSTAT ;AF OR RF METER ? BIT 6,(HL) LD HL,MTRAUD ;LOAD AUDIO DATA AND POINT TO AF METER TABLE LD A,(DACCTL+3) JR NZ,20$ ;BRANCH IF AF LD HL,MTRRF ;ELSE LOAD RF DATA AND POINT TO RF METER TABLE CALL TSTAUD ;USE ISB DATA IF ISB AUDIO ACTIVE LD A,(DACCTL+1) JR Z,15$ LD A,(DACCTL+2) ;ELSE USE MAIN IF PATH DATA 15$ CPL ;INVERT RF METER DATA 20$ LD D,A ;SAVE METER DATA IN D FOR CALCULATIONS SUB A ;CLEAR INITIAL STORAGE LD BC,DACWRK+1 LD (BC),A DEC BC LD (BC),A ;LEAVE BC POINTING TO BOTTOM OF STORAGE 25$ LD E,1 ;SET UP A MOVING 1 IN E 30$ LD A,D ;GET METER DATA SUB (HL) ;SUBTRACT TABLE VALUE FROM IT JR C,35$ ;BRANCH IF TOO MUCH-- DONE LD D,A ;ELSE SAVE REMAINDER FOR NEXT TIME INC HL ;POINT TO NEXT TABLE ENTRY LD A,(BC) ;TURN ON ANOTHER METER BAR SEGMENT OR E LD (BC),A SLA E ;MOVE UP THE MOVING BIT FOR NEXT TEST BIT 6,E ;ONLY 6 BARS ALLOWED PER PORT JR Z,30$ ;BRANCH IF NOT 6 YET INC BC ;ELSE START ON NEXT PORT JR 25$ ;GO DO IT 35$ LD A,(DACWRK) ;OUTPUT THE LOW ORDER METER SEGMENTS CPL OUT (0),A LD A,(DACWRK+1) ;NOW OUTPUT THE HIGH ORDER SEGMENTS CPL OUT (1),A RET ;DONE ;THIS ROUTINE PERFORMS THE A/D CONVERSION TASKS REQUIRED BY DAC AND BITE, AS ;WELL AS ANY OTHER ROUTINE THAT NEEDS A DIGITIZED VALUE OF THE AF, RF, OR BITE ;LINES. ENTERED WITH C CONTAINING THE MASK BIT FOR THE COMPARATORS. RETURNS ;WITH THE RESULTS IN THE ACCUMULATOR. MASK BIT IN C DEFINED AS: ; ; BIT 7 = AIIS (BITE 4) BIT 3 = IMET (ISB METER) ; BIT 6 = SOS (BITE 3) BIT 2 = BIFGB (OLD POWER SUPPLY MON) ; BIT 5 = MOS (BITE 2) BIT 1 = ARFM (AGC, RF METER) ; BIT 4 = XRFS (BITE 1) BIT 0 = DAFM (AUDIO, AF METER) ; ; DACCVT PUSH DE ;SAVE DE LD A,(PORT92) ;DISCONNECT DAC FROM AGC DURING CONVERSION RES 4,A OUT (92H),A CALL TSTISB ;DISCONNECT ISB AGC DAC IF ISB INSTALLED JR NZ,5$ LD A,(PORT97) RES 1,A OUT (97H),A 5$ LD A,80H ;SET UP E WITH FIRST TEST BIT LD E,A 10$ OUT (2),A ;SET UP DAC LD D,A ;SAVE ACCUMULATED RESULTS IN D JR 15$ ;PAUSE 15$ JR 20$ 20$ IN A,(3) ;GET COMPARATOR INPUTS AND C ;SELECT PROPER BIT LD A,D ;GET ACCUMULATED DATA JR Z,25$ ;BRANCH IF NEW BIT NEEDED XOR E ;ELSE REMOVE IT LD D,A ;SAVE NEW VALUE 25$ SRL E ;SHIFT TEST BIT DOWN JR Z,30$ ;BRANCH IF DONE OR E ;ELSE SET NEW TEST BIT IN ACCUMULATED RESULTS JR 10$ ;GO OUTPUT IT 30$ LD A,(DACLVL) ;RESET DAC LEVEL OUT (2),A LD A,(PORT92) ;RECONNECT DAC TO AGC CIRCUITRY OUT (92H),A CALL TSTISB ;RECONNECT ISB AGC DAC IF ISB INSTALLED JR NZ,35$ LD A,(PORT97) OUT (97H),A 35$ LD A,D ;RETURN WITH RESULTS IN ACCUMULATOR POP DE ;RESTORE DE RET ;DONE ;THIS ROUTINE SETS UP THE UART OPERATING PARAMETERS, INCLUDING BAUD ;RATE, PARITY, WORD LENGTH AND STOP BITS ; SETURT IN A,(9EH) ;GET RECEIVER ADDRESS LD HL,ADRES ;COMPARE AGAINST OLD ADDRESS CP (HL) JR Z,5$ ;BRANCH IF SAME LD (HL),A ;ELSE UPDATE STORAGE SUB A ;KILL TALK AND LISTEN ENABLE FLAGS LD (TLKREQ),A 5$ IN A,(9CH) ;GET CONFIGURATION DATA FOR UART LD HL,URTCFG ;COMPARE AGAINST HISTORY DATA CP (HL) RET Z ;DONE IF COMPARES LD (HL),A ;ELSE REPLACE OLD DATA OUT (9AH),A ;OUTPUT CHAR LENGTH, PARITY, STOP BITS LD A,(PORT9D) ;ISOLATE TX AND RX INTERRUPT ENABLE BITS AND 0F8H LD B,A LD A,(HL) ;ADD IN SWITCH BAUD RATE SELECTION AND 7 OR B LD (PORT9D),A ;UPDATE STORAGE AND HARDWARE OUT (9DH),A RET ;DONE ;ADD (OR SUBTRACT) BCDWRK TO FRQWRK. ;TUNE CONTROL IN REG B. ;DESTROYS A,C,D,E,H,L ; FRQLD LD HL,BCDWRK ;POINT TO NEW DATA LD C,B ;COPY TUNE RATE INTO C JR 10$ ;BRANCH INTO SHIFT LOOP 5$ CALL SHFBCD 10$ DEC C JR NZ,5$ EX DE,HL LD HL,FRQWRK LD C,4 AND A ;CLEAR CARRY BIT 15$ LD A,(DE) ;GET BCDWRK DIGIT ADC A,(HL) ;ADD IN FRQWRK DIGIT WITH CARRY BIT DAA ;KEEP BCD LD (HL),A ;SAVE FINISHED DIGIT BACK IN FRQWRK INC HL ;INCREMENT POINTERS INC DE DEC C ;DECREMENT COUNTER JR NZ,15$ ;DO ALL 4 DIGITS RET ;DONE ;THIS ROUTINE IS USED TO ADD OR SUBTRACT (BCD) AN AMOUNT FROM ;THE BFO STORAGE AREA. ; BFOLD LD HL,BFOWRK ;POINT TO STORAGE LD DE,BCDWRK ;ALSO POINT TO NEW DATA LD A,(DE) ;GET NEW DATA LSD'S ADD A,(HL) ;ADD TO RECEIVER STORAGE VALUE DAA ;MAKE BCD AGAIN LD (HL),A ;STORE AWAY IN RECEIVER STORAGE INC HL ;UPDATE POINTER FOR MSD'S INC DE LD A,(DE) ;GET NEW DATA MSD'S ADC A,(HL) ;ADD IN OLD MSD'S AND CARRY FROM LSD'S DAA ;ADJUST FOR BCD LD (HL),A ;SAVE IN RECEIVER STORAGE JP M,5$ ;BRANCH IF NEGATIVE VALUE CP 8 ;CHECK FOR POSITIVE VALUE OVERFLOW RET C ;RETURN IF OK LD (HL),8 ;ELSE FORCE MAXIMUM VALUE (8 KHZ) JR 10$ 5$ CP 92H ;CHECK FOR NEGATIVE VALUE OVERFLOW RET NC ;RETURN IF OK LD (HL),92H ;ELSE FORCE NEGATIVE MAXIMUM VALUE (-8 KHZ) 10$ DEC HL LD (HL),0 ;TAKE CARE OF LSD'S RET ;RETURN ;THIS ROUTINE SENDS THE 7 LSB'S IN THE ACCUMULATOR SERIALLY TO THE 3RD LO ;(BASEBAND) SYNTHESIZER WITH THE CORRECT CLOCK AND PROGRAM ENABLE (PE) STROBE ; LD3LO RRCA ;POSITION DATA RRCA RRCA LD C,A ;SAVE IN C LD A,(PORT97) ;GET PORT 97 IMAGE AND 0C7H ;MASK OFF 3 LO BITS AND FORCE PE STROBE TO 0 LD D,A ;SAVE REMAINDER IN D LD B,7 ;SET COUNTER FOR 7 BITS 5$ LD A,8 ;ISOLATE DATA BIT AND C OR D ;ADD IN OTHER PORT 97 DATA OUT (97H),A ;OUTPUT PORT 97 DATA WITH 3RD LO CONTROL DATA SET 4,A ;STROBE THE CLOCK BIT HIGH OUT (97H),A RLC C ;POSITION THE NEXT DATA BIT DJNZ 5$ ;GO BACK IF MORE TO DO LD A,D ;STROBE PE SET 5,A OUT (97H),A LD A,D LD (PORT97),A ;SAVE A COPY OF UPDATED PORT 97 IMAGE OUT (97H),A RET ;DONE ;THIS ROUTINE SORTS THE SYMMETRICAL FILTERS REPRESENTED IN FILTAB BY SIZE, ;AND STORES THE RELATIVE SIZE VS FILTER SLOT ORDER IN IFTRAN. NON-SYMMETRICAL ;FILTERS ARE REPRESENTED BY 0. ; BWTAB SUB A ;START WITH IMAGINARY BYPASS SLOT 5$ LD E,A ;SAVE SLOT NUMBER IN E RLCA ;MULTIPLY SLOT NUMBER X3 ADD A,E LD HL,FILTAB ;AUGMENT FILTAB TABLE POINTER CALL ADC LD A,(HL) ;TEST THIS FILTER TYPE CP 0B0H LD D,0 ;INIT M > N COUNTER BEFORE DECISION JR NC,25$ ;BRANCH IF NON-SYMMETRICAL FILTER OR SPECIAL PUSH HL ;ELSE MOVE POINTER TO IX POP IX LD IY,FILTAB ;USE IY AS REMAINING TABLE ENTRIES COMPARE PTR LD B,6 ;TEST ALL TABLE ENTRIES VS FILTER UNDER TEST 10$ LD A,(IX) ;GET THIS FILTER'S MSD'S CP (IY) ;COMPARE TO OTHER FILTER'S MSD'S JR C,20$ ;BRANCH IF THIS FILTER IS SMALLER JR NZ,15$ ;BRANCH IF THIS FILTER IS BIGGER LD A,(IX+1) ;ELSE TEST MIDDLE DIGITS CP (IY+1) JR C,20$ ;BRANCH IF SMALLER JR NZ,15$ ;BRANCH IF BIGGER LD A,(IX+2) ;ELSE MUST TEST LSD'S CP (IY+2) JR C,20$ ;BRANCH IF SMALLER 15$ INC D ;INCREMENT M > N COUNTER 20$ INC IY ;UPDATE COMPARE POINTER INC IY INC IY DJNZ 10$ ;TEST ALL OTHER FILTERS AGAINST THIS ONE 25$ LD HL,IFTRAN ;POINT TO PROPER IFTRAN SLOT FOR THIS FILTER LD A,E CALL ADC LD (HL),D ;LOAD RELATIVE SIZE INDICATOR INC A ;POINT TO NEXT FILTER FOR SIZING CP 6 JR C,5$ ;BRANCH BACK TO TEST NEXT FILTER LD HL,IFTRAN ;TABLES COMPLETE-- TEST USER'S FILTER AGAINST LD A,(FILTER) ; NEW TABLE SET-UPS CALL ADC SUB A ADD A,(HL) RET NZ ;DONE IF USER'S FILTER IS SYMMETRICAL LD HL,IFTRAN+5 ;ELSE FIND SYMMETRICAL FILTER FOR USER LD B,5 30$ ADD A,(HL) JR NZ,35$ DEC HL DJNZ 30$ 35$ LD A,B ;COPY FILTER SLOT INTO USER STORAGE LD (FILTER),A RET ;DONE ;THIS ROUTINE SEARCHES FILTAB FOR THE OCCURRENCE OF THE FILTER TYPE ;SPECIFIED IN THE ACCUMULATOR. IF NOT FOUND, THE ZERO STATUS BIT IS SET ;ON RETURN. IF FOUND, THE ZERO BIT IS CLEARED, THE FIRST SLOT CONTAINING ;THE FILTER TYPE IS RETURNED IN B, AND E AND THE ACCUMULATOR CONTAIN THE ;TOTAL NUMBER OF SLOTS CONTAINING THIS KIND OF FILTER. ; COUNT LD HL,FILTAB+15 ;POINT TO LAST ENTRY IN FILTAB AND WORK LD B,5 ; BACKWARDS-- TEST 5 ENTRIES-- IGNORE BYPASS LD E,0 ;INITIALIZE COUNTER TO ZERO MATCHES 5$ CP (HL) ;TEST ENTRY JR NZ,10$ ;BRANCH IF NO MATCH LD D,B ;ELSE COPY ENTRY NUMBER INTO D TEMP INC E ;INCREMENT MATCH COUNTER 10$ DEC HL ;TEST NEXT ENTRY DEC HL DEC HL DJNZ 5$ ;DO ALL ENTRIES LD B,D ;COPY LOWEST FILTAB ENTRY INTO B FOR RETURN SUB A ;SET CC'S FOR SUCCESS OR NOT OR E RET ;DONE ;THIS ROUTINE EXAMINES THE INPUT BUFFER, AND IF NOT EMPTY ;RETURNS THE NEXT CHARACTER FROM IT TO THE CALLING ROUTINE ;IN THE C REG AND THE ACCUMULATOR. IF THE CHARACTER IS A ;NUMBER, THE Z FLAG IS SET. IF THE BUFFER IS EMPTY, THE ;BACKGROUND (OR BITE) PROGRAM IS CONTINUED. ; G1CR PUSH DE ;SAVE DE AND HL PAIRS PUSH HL G1CR1 LD HL,INBUF ;RE-ENTRY POINT FROM BACKGROUND BIT 3,(HL) ;TEST IF INBUF EMPTY JR NZ,15$ ;BRANCH IF YES DI ;ELSE KILL INTERRUPTS AND GET NEW DATA INC HL ;POINT TO INPUT POINTER LD D,(HL) ;SAVE TEMP IN D REG INC HL ;GET OUTPUT POINTER TO B REG LD A,(HL) LD B,A INC A ;UPDATE FOR NEXT TIME LD (HL),A ;SAVE FOR NEXT TIME INC HL ;POINT TO START OF FIFO XOR D ;COMPARE INPUT POINTER TO NEW OUTPUT POINTER LD A,8 ;PRESET EMPTY BUFFER FLAG FOR NEXT TIME JR Z,5$ ;BRANCH IF BUFFER EMPTY SUB A ;ELSE SET BUFFER NOT EMPTY FLAG 5$ LD (INBUF),A ;SET NEW BUFFER FLAG LD A,B ;GET OUTPUT POINTER FOR THIS TIME CALL ADC ;AUGMENT TO DATA FOR THIS TIME LD C,(HL) ;GET DATA TO C REG EI LD A,C ;GET NEW DATA CP ' ' ;BRANCH AND IGNORE IF SPACE JR Z,G1CR1 CP 10 ;BRANCH AND IGNORE IF LINE FEED JR Z,G1CR1 CP '+' ;BRANCH AND IGNORE + SIGNS JR Z,G1CR1 SUB '0' ;TRY TO CONVERT TO A NUMBER CP 10 JR NC,10$ ;BRANCH IF NOT A NUMBER LD C,A ;ELSE REPLACE DATA WITH NUMERIC FORM SUB A ;SET NUMBER FLAG (ZERO CONDITION CODE) 10$ AND A ;SET FLAG FOR NUMBER OR OTHER LD A,C ;RETURN WITH NEW DATA IN A AND C REGS POP HL ;RESTORE DE AND HL PAIRS POP DE RET ;GO PROCESS NEW DATA 15$ LD A,(RXSTAT) ;TEST IF BITE ACTIVE BIT 2,A JP NZ,BITRTN ;JUMP BACK TO BITE IF ACTIVE JP BAKGND ;ELSE RESUME BACKGROUND ;THIS IS THE UNLISTEN COMMAND HANDLER. IF ONLY THIS DEVICE ADDRESS ;IS SENT, BOTH TALK AND LISTEN ENABLE BITS WILL BE SET. IF THIS ;DEVICE ADDRESS AND OTHER DEVICE ADDRESSES ARE SENT, ONLY THE LISTEN ;ENABLE BIT WILL BE SET. OTHERWISE THIS DEVICE WILL NOT TALK OR ;LISTEN. ; UNLSTN LD D,0 ;INITIALIZE ALL BITS TO ZERO 5$ CALL GETBCD ;GET DEVICE ADDRESS LD A,(INWRK+4) LD HL,ADRES ;SEE IF SAME AS THIS DEVICE'S ADDRESS CP (HL) JR NZ,10$ ;BRANCH IF NOT SET 5,D ;ELSE SET LISTEN ENABLE BIT JR 15$ ;BRANCH TO CONTINUE 10$ SET 4,D ;SET "OTHER RXS" FLAG 15$ LD A,C ;TEST IF COMMA OR SEMICOLON DELIMITER CP ',' JR Z,5$ CP ';' JR Z,5$ ;BRANCH IF YES BIT 4,D ;TEST IF OTHER RXS ADDRESSED JR NZ,20$ ;BRANCH IF YES BIT 5,D ;TEST IF THIS RX ADDRESSED JR Z,20$ ;BRANCH IF NOT SET 6,D ;ELSE SET TALK ENABLE BIT 20$ LD A,D ;GET NEW TALK / LISTEN BITS LD (TLKREQ),A ;SAVE IN STORAGE JP INPRTN ;DONE ;THIS ROUTINE HANDLES THE INCOMING REMOTE DETECTOR DATA ; DETIN LD HL,RXSTAT+2 ;INITIALLY RESET "D=" BIT RES 1,(HL) CALL GETNUM ;GET DETECTOR NUMBER CP '=' ;TEST IF NEW DATA IS "=" JR Z,15$ ;BRANCH IF YES SUB A ;TEST IF NEW INPUT IS IN RANGE (1-8) ADD A,(HL) JR Z,ERLOG ;ERROR IF NOT CP 9 JR NC,ERLOG AND 7 ;CONVERT GOOD DATA TO RANGE 0-7 JR Z,5$ ;IF NEW DATA ISB, CHECK INSTALLED CP 5 JR NZ,10$ 5$ LD B,A CALL TSTISB JR NZ,ERLOG ;ERROR IF ISB INPUT BUT NOT INSTALLED LD A,B 10$ LD (INDET),A ;SAVE NEW DATA IN STORAGE LD A,20H ;SET COMBYT FLAG BIT JR COMBLD ;GO FINISH UP 15$ CALL GETNUM ;GET OVERIDE DETECTOR NUMBER SUB A ADD A,(HL) ;VERIFY RANGE JR Z,ERLOG ;BRANCH IF 0 (ERROR) CP 5 JR NC,ERLOG ;BRANCH IF OVER 4 (ERROR) CP 1 ;ELSE MAKE RX COMPATIBLE CODE JR Z,20$ XOR 1 20$ LD HL,RXSTAT+2 ;SET "D=" BIT SET 1,(HL) JR 10$ ;GO SAVE OVERIDE DETECTOR DATA ; ; ;THIS ROUTINE HANDLES THE INPUT FREQUENCY DATA ; FRQIN CALL GETBCD ;GET NEW FREQUENCY INPUT DATA LD HL,INWRK+1 ;COPY NEW DATA INTO INTERMEDIATE REGS LD DE,INFRQ LD BC,4 LDIR LD C,A ;LEAVE WITH NEWEST INPUT CHAR IN C LD A,40H ;SET NEW FREQUENCY FLAG BIT JR COMBLD ;GO FINISH UP ; ; ;THIS ROUTINE HANDLES THE INPUT BFO DATA ; BFOIN CALL GETBCD ;GET NEW BFO INPUT DATA CP '-' ;BRANCH IF DATA POSITIVE JR NZ,10$ CALL GETBCD ;ELSE TRY GETTING NEGATIVE BFO DATA LD HL,INWRK+3 ;CONVERT NEGATIVE DATA TO 10'S COMPLEMENT LD B,2 ; FOR STORAGE XOR A ;CLEAR CARRY FLAG 5$ SBC A,(HL) ;SUBTRACT NUMBER FROM 10,000 DAA LD (HL),A INC HL LD A,0 DJNZ 5$ LD A,C ;RELOAD ACCUMULATOR WITH NEWEST INPUT CHAR 10$ LD HL,INWRK+3 ;COPY NEW BFO DATA INTO INTERMEDIATE REGS LD DE,INBFO LD BC,2 LDIR LD C,A ;LEAVE WITH NEWEST DATA IN C LD A,4 ;SET COMBYT FLAG BIT ; ; ;THIS ROUTINE SETS THE INPUT COMMAND FLAG BITS IN COMBYT ; COMBLD LD HL,COMBYT ;GET INPUT DATA FLAGS BYTE OR (HL) ;ADD IN NEW FLAG BIT LD (HL),A JP INPRTN ;RETURN FOR NEW DATA ; ; ;THIS ROUTINE SETS THE COMMAND ERROR BIT ;IN THE RECEIVER STATUS WORD ; ERLOG LD HL,RXSTAT+2 ;LOG ERROR SET 4,(HL) JP INPRTN ; ; ;THIS ROUTINE HANDLES THE INPUT ATTENUATION DATA ; ATNIN CALL GETNUM ;GET MGC DATA LD A,(HL) CPL ;COMPLEMENT IT LD (INMGC),A ;SAVE IN STORAGE LD A,2 ;SET COMBYT FLAG BIT JR COMBLD ;GO FINISH UP ; ; ;THIS ROUTINE HANDLES THE INPUT AGC DATA ; AGCIN CALL GETNUM ;GET AGC DATA, VERIFY IN RANGE (1-7) SUB A ADD A,(HL) JR Z,ERLOG ;ERROR IF NOT CP 8 JR NC,ERLOG LD HL,AGCTRN-1 ;CONVERT GOOD INPUT TO RECEIVER COMPATIBLE CODE CALL ADC ; FOR USE BY BOTH MAIN AND ISB AGC LD A,(HL) LD (INAGC),A ;SAVE DATA IN STORAGE LD A,8 ;SET COMBYT FLAG BIT JR COMBLD ;GO FINISH UP ; ; ;THIS ROUTINE HANDLES THE INPUT FILTER DATA ; FILIN LD HL,RXSTAT+2 ;RESET "I=" BIT RES 0,(HL) CALL GETBCD ;GET NEW FILTER DATA CP '=' ;BRANCH IF OVERRIDE FILTER DATA JR Z,20$ LD IX,INWRK ;SET MAX POSSIBLE DIFFERENCE IN WORKSPACE LD (IX),99H LD (IX+1),99H LD (IX+2),99H LD IY,FILTAB+15 ;POINT TO FILTER TABLE LD B,5 ;FIND NEAREST FILTER FROM TABLE FOR NEW DATA 5$ LD A,(IY) ;GET FILTER FROM TABLE CP 0B0H ;BRANCH, IGNORE IF NOT SYMMETRICAL JR NC,15$ LD A,(IY+2) ;FIND ABSOLUTE DIFFERENCE BETWEEN DESIRED SUB (IX+3) ; INPUT AND THIS TABLE ENTRY, SAVE IN E,H,L DAA LD L,A LD A,(IY+1) SBC A,(IX+4) DAA LD H,A LD A,(IY) SBC A,(IX+5) DAA LD E,A JR NC,10$ ;BRANCH IF DIFFERENCE POSITIVE SUB A ;ELSE NEGATE DIFFERENCE TO MAKE POSITIVE SUB L DAA LD L,A LD A,0 SBC A,H DAA LD H,A LD A,0 SBC A,E DAA LD E,A 10$ LD A,L ;SUBTRACT OLD DELTA FROM NEW DELTA SUB (IX) DAA LD A,H SBC A,(IX+1) DAA LD A,E SBC A,(IX+2) DAA JR NC,15$ ;BRANCH IF NO BORROW (OLD DELTA IS SMALLER) LD (IX),L ;ELSE REPLACE OLD DELTA WITH SMALLER NEW DELTA LD (IX+1),H LD (IX+2),E LD D,B ;KEEP A COPY OF THIS FILTER'S SLOT NUMBER 15$ DEC IY ;UPDATE FILTER TABLE POINTER DEC IY DEC IY DJNZ 5$ ;TEST ALL FILTER TABLE ENTRIES LD A,D ;RETRIEVE BEST FIT WHEN DONE JR 25$ ;GO SAVE FILTER SLOT NUMBER 20$ CALL GETNUM ;GET OVERRIDE FILTER NUMBER SUB A ;VERIFY LEGAL RANGE (1-5) ADD A,(HL) JP Z,ERLOG ;ERROR IF NOT CP 6 JP NC,ERLOG LD HL,RXSTAT+2 ;SET "I=" BIT SET 0,(HL) 25$ LD (INFIL),A ;SAVE FILTER SLOT NUMBER LD A,10H ;SET NEW FILTER FLAG BIT JP COMBLD ;GO FINISH UP ;SELECTIVE TALKER INPUT HANDLER ; SELIN SUB A ;INITIALIZE STORAGE 5$ LD D,A CALL G1CR ;GET TALKER CHARACTER LD HL,COMLET ;POINT TO TABLE FOR COMPARE LD B,40H ;SET UP MOVING BIT 10$ CP (HL) ;COMPARE TABLE ENTRY TO INPUT DATA JR Z,15$ ;BRANCH IF COMPARE SRL B ;ELSE SHIFT DOWN MOVING BIT JR Z,20$ ;BRANCH IF NO COMPARE IN TABLE INC HL INC HL INC HL ;POINT TO NEXT TABLE ENTRY JR 10$ ;TRY AGAIN 15$ LD A,D ;GET ACCUMULATED DATA OR B ;ADD IN NEW BIT JR 5$ ;GO SAVE IT 20$ SUB A ;TEST IF ANY INPUTS ADD A,D JR Z,25$ ;BRANCH IF NO, USE OLD TLKBYT LD (TLKBYT),A ;ELSE REPLACE TLKBYT 25$ LD HL,TLKREQ ;SET RX MONITOR REQUEST BIT SET 3,(HL) JP INPRTN ;GO AFTER NEW DATA ; ; ;GROUP TALKER HANDLER ; TLKIN LD A,7EH ;SET ALL TALK BITS WITH TALK REQUEST BIT LD (TLKBYT),A LD HL,TLKREQ SET 3,(HL) JP INPUT ;GO AFTER NEW DATA ; ; ;STATUS INPUT COMMAND HANDLER ; STATIN CALL G1CR ;GET STATUS COMMAND NUMBER JP NZ,ERLOG ;ERROR IF NOT NUMERIC LD HL,STATBL ;ELSE VECTOR TO ROUTINE RLCA CALL ADC LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) ; ; SETLOC LD HL,RXSTAT ;CLEAR REMOTE BIT TO LOCAL RES 0,(HL) JR STATDN ;DONE ; SETRMT LD HL,RXSTAT ;SET REMOTE FLAG SET 0,(HL) JR STATDN ;DONE ; RAGCDP LD HL,RXSTAT+2 ;ALLOW REMOTE AGC DUMP RES 7,(HL) STATDN JP INPUT ; RAGCOF LD HL,RXSTAT+2 ;INHIBIT REMOTE AGC DUMP SET 7,(HL) JR STATDN ; EXCBIT LD A,80H ;SET "EXECUTE BITE" FLAG JP COMBLD ; TRMBIT LD A,1 ;SET "TERMINATE BITE" FLAG JP COMBLD ; RPTBW LD A,2 ;SET "REPORT BANDWIDTHS" FLAG JR REPORT ; RPTBIT LD A,1 ;SET "REPORT BITE RESULTS" FLAG REPORT LD HL,TLKREQ OR (HL) LD (HL),A JR STATDN ; FFILSU LD A,(RXSTAT) ;FORCE FILTER MODE NOT ALLOWED DURING BITE BIT 2,A JR NZ,STATDN BIT 0,A ;MUST BE REMOTE JR Z,STATDN LD L,1 ;START WITH SLOT 1 5$ PUSH HL ;SAVE SLOT POINTER CALL GETBCD ;GET FILTER SLOT DATA POP HL ;RETRIEVE SLOT POINTER LD IY,FILTAB ;POINT TO FILTER TABLE ENTRY LD A,L RLCA ADD A,L LD E,A LD D,0 ADD IY,DE LD IX,INWRK ;POINT TO NEW INPUT DATA LD A,(IX+3) ;TEST IF ANY NUMERIC DATA INPUT OR (IX+4) OR (IX+5) JR Z,10$ ;BRANCH IF NOT LD A,(IX+3) ;ELSE LOAD FILTAB WITH NEW NUMERICAL INPUT LD (IY+2),A ; DATA LD A,(IX+4) LD (IY+1),A LD A,(IX+5) LD (IY),A INC IY ;UPDATE FILTAB POINTER TO NEXT FILTER SLOT INC IY INC IY INC L ;UPDATE FILTER NUMBER 10$ LD A,'N' ;"N" INPUT ? CP C LD A,0B0H JR Z,15$ ;BRANCH IF YES LD A,'L' ;"L" ? CP C LD A,0B4H JR Z,15$ ;BRANCH IF YES LD A,'U' ;"U" ? CP C LD A,0B8H JR NZ,20$ ;BRANCH IF NONE OF THE ABOVE 15$ LD (IY),A ;STORE N, L, OR U IN FILTAB (B0, B4, B8) LD (IY+1),0 ;ZERO REMAINING ENTRIES FOR THIS FILTER LD (IY+2),0 INC L ;UPDATE FILTER NUMBER LD C,0 ;KILL OLD INPUT DATA FOR INPUT ROUTINE JR 25$ ;GO SEE IF DONE 20$ LD A,C ;TEST IF DELIMITER IS COMMA OR SEMICOLON CP ',' JR Z,25$ CP ';' JR NZ,30$ ;BRANCH IF NEITHER, DONE 25$ LD A,L ;BRANCH BACK IF MORE TO DO CP 6 JR C,5$ 30$ CALL BWTAB ;SET UP FILTER TABLES JP INPRTN ;DONE ;THIS IS THE INPUT TERMINATOR HANDLER. ALL DATA RECEIVED IS PROCESSED ;AT THIS POINT, AND IF NECESSARY THE OUTPUT SYSTEM IS SET UP. ; ENDIN LD HL,RXSTAT+2 ;POINT TO RX STATUS WORD RES 2,(HL) ;PRE-CLEAR OVERIDE MODE LD A,(RXSTAT) ;REMOTE ? BIT 0,A JR Z,10$ ;BRANCH IF LOCAL LD A,(HL) ;SET OVERIDE MODE IF NEEDED AND 3 CP 3 JR NZ,5$ SET 2,(HL) 5$ CALL RCOMEX ;TRANSFER NEW REMOTE DATA INTO RX REGS 10$ LD A,(RXSTAT) ;DON'T SET UP RECEIVER IF BITE ACTIVE BIT 2,A JR NZ,15$ CALL SETRCR ;SET UP REMOTE COMMANDS CALL SETDSP ;DISPLAY NEW DATA 15$ LD A,(TLKREQ) ;CHECK TALK REQUEST BITS BIT 6,A ;SKIP REST IF TALK NOT ENABLED JP Z,98$ AND 0BH JP Z,INPUT ;DONE IF NO TALK REQUESTED LD C,A ;ELSE TEMP SAVE TALK BITS LD HL,PORT9D ;KILL UART TX INTERRUPTS DURING SETUP RES 3,(HL) LD A,(HL) OUT (9DH),A LD DE,OUTBUF+1 ;SET UP POINTER TO OUTBUF LD A,(RXSTAT) BIT 2,A LD A,':' ;OUTPUT ONLY COLON IF BITE RUNNING JP NZ,97$ ;JUMP IF BITE IN PROGRESS BIT 3,C ;NEED RX MONITOR? JR Z,50$ ;BRANCH IF NOT LD A,(TLKBYT) ;ELSE LOAD RX TALKER BITS LD C,A LD A,(DETECT) ;PREPARE TO OUTPUT RECEIVER DATA LD B,A ;FIRST ELIMINATE ILLEGAL FLAG BITS AND A JR Z,20$ ;BRANCH IF ISB-U CP 5 JR C,25$ ;BRANCH IF NOT SSB MODE 20$ RES 4,C ;KILL FILTER DATA IF SSB DETECTOR MODE 25$ CP 3 ;KILL BFO DATA IF NOT CW VARIABLE JR Z,30$ RES 2,C 30$ LD HL,AGC ;KILL ATTENUATION DATA IF NOT MGC BIT 2,(HL) JR NZ,35$ RES 1,C 35$ CALL DATOUT ;OUTPUT RX DATA LD A,'R' ;LOAD RF METER PREFIX LD (DE),A INC DE LD HL,DACCTL+2 ;POINT TO RF METER DATA CALL TSTAUD ;USE MAIN RF DATA IF AUDIO NOT ISB JR NZ,40$ DEC HL ;ELSE USE ISB DATA 40$ LD A,(HL) ;GET DATA CPL ;COMPLEMENT IT CALL BCDLD ;LOAD DATA IN OUTBUF LD A,'S' ;LOAD STATUS PREFIX LD (DE),A INC DE LD A,(RXSTAT) ;GET REMOTE BIT AND 1 LD B,A ;SAVE ACCUMULATED DATA IN B LD IX,RXSTAT ;TEST OOL'S, SET STATUS BIT IF SET LD A,(IX+1) RES 6,(IX+1) ;RESET OOL HISTORY BIT AND 4FH JR Z,45$ SET 1,B 45$ LD A,(IX+2) ;LOAD THE OVERRIDE, UART AND COMMAND ERROR BITS LD H,A ;CLEAR THE UART AND COMMAND ERROR HISTORY BITS AND 0C7H LD (IX+2),A LD A,H AND 3CH OR B ;ADD IN THE REST OF THE ACCUMULATED STATUS BITS CALL BCDLD ;LOAD THEM INTO THE OUTPUT BUFFER 50$ LD HL,TLKREQ ;FILTER COMPLEMENT REPORT REQUESTED? BIT 1,(HL) JR Z,75$ ;BRANCH IF NOT LD C,1 ;START WITH FILTER SLOT 1 LD A,' ' ;OUTPUT INITIAL SPACE AS FIELD DELIMITER 55$ LD (DE),A ;OUTPUT DELIMITER INC DE LD HL,FILTAB ;POINT TO FILTER DEFINITION TABLE LD A,C ;AUGMENT POINTER USING FILTER NUMBER RLCA ADD A,C CALL ADC LD A,0B0H ;BLANK SLOT? CP (HL) LD A,' ' JR Z,60$ ;BRANCH IF YES, OUTPUT SPACE LD A,0B4H ;LSB FILTER? CP (HL) LD A,'L' JR Z,60$ ;BRANCH IF YES, USE "L" LD A,0B8H ;USB FILTER? CP (HL) LD A,'U' JR NZ,65$ ;BRANCH IF NO, ELSE USE "U" 60$ LD (DE),A ;LOAD CHARACTER INTO OUTPUT BUFFER INC DE JR 70$ ;BRANCH AND CONTINUE 65$ LD A,C ;OUTPUT FILTER NUMERICAL DATA CALL FILOUT 70$ INC C ;LOOK AT NEXT FILTER LD A,C ;TEST IF DONE CP 6 LD A,',' ;PREPARE DELIMITER IN CASE NEEDED JR C,55$ ;BRANCH IF MORE TO DO 75$ LD HL,TLKREQ ;POINT AGAIN TO TALK REQUEST BITS BIT 0,(HL) ;BITE RESULTS REQUESTED? JR Z,96$ ;BRANCH IF NOT LD HL,ERBITE ;GET NUMBER OF BITE ERRORS SUB A ADD A,(HL) JR Z,90$ ;BRANCH IF NO ERRORS LD B,A ;ELSE SAVE AS COUNTER LD A,' ' ;SET UP SPACE AS FIELD DELIMITER 80$ LD (DE),A ;OUTPUT DELIMITER INC DE INC HL ;POINT TO NEXT ERROR FOR OUTPUT LD A,(HL) CALL SHFTR4 ;ISOLATE MSD JR Z,85$ ;BRANCH AND IGNORE IF 0 LD (DE),A ;OUTPUT MSD INC DE 85$ LD A,(HL) ;ISOLATE LSD AND 0FH LD (DE),A ;OUTPUT LSD INC DE LD A,',' ;SET UP COMMA DELIMITER DJNZ 80$ ;CONTINUE FOR ALL ERRORS LD A,'E' ;OUTPUT "END" MESSAGE LD (DE),A INC DE LD A,'N' LD (DE),A INC DE LD A,'D' JR 95$ ;BRANCH TO COMPLETE 90$ LD A,' ' ;OUTPUT SPACE DELIMITER LD (DE),A INC DE LD A,'O' ;OUTPUT "OK" MESSAGE LD (DE),A INC DE LD A,'K' 95$ LD (DE),A INC DE LD A,(ADRES) ;OUTPUT UNIT ADDRESS CALL BCDLD 96$ LD A,13 ;LOAD TERMINATOR IN OUTBUF 97$ LD (DE),A LD A,1 ;TURN ON THE OUTPUT SYSTEM LD (OUTBUF),A LD HL,PORT9D ;ENABLE UART TX INTERRUPTS SET 3,(HL) LD A,(HL) OUT (9DH),A 98$ LD HL,TLKREQ ;CLEAR THE RETURN REQUEST BITS LD A,70H AND (HL) LD (HL),A JP INPUT ;DONE ;THIS SUBROUTINE IS USED BY ENDIN TO OUTPUT BLOCKS OF DATA FOR THE ;RECEIVER STATUS ; DATOUT BIT 6,C ;SEE IF FREQUENCY NEEDED JR Z,40$ ;BRANCH IF NOT LD A,'F' ;LOAD OUTBUF WITH FREQ PREFIX LD (DE),A INC DE LD B,6 ;DETERMINE NUMBER OF FRACTIONAL DIGITS LD HL,FRQWRK SUB A 5$ ADD A,(HL) JR NZ,10$ ;BRANCH IF SOME FRACTIONAL PART INC HL ;ELSE TEST NEXT BYTE DEC B ;ADJUST COUNTER DJNZ 5$ ;BRANCH IF SOME LEFT TO TEST JR 15$ ;ELSE NO FRACTIONAL PART 10$ CALL SHFTL4 ;DETERMINE IF ODD FRACTIONAL DIGIT JR NZ,15$ ;BRANCH IF NO (EVEN) DEC B ;ELSE ADJUST COUNTER 15$ LD HL,FRQWRK+3 ;GET MHZ DIGITS SUB A ADD A,(HL) ;SEE IF ANY JR NZ,20$ ;BRANCH IF NOT ZERO ADD A,B ;IF ZERO, ADD FRACTIONAL COUNTER JR NZ,30$ ;BRANCH IF FRACTION ONLY LD (DE),A ;ELSE LOAD ONLY "0" IN OUTBUF INC DE JR 40$ ;DONE (F0) 20$ CALL SHFTR4 ;SEE IF 10 MHZ PART JR Z,25$ ;BRANCH IF NOT LD (DE),A ;ELSE LOAD IN OUTBUF INC DE 25$ LD A,(HL) ;GET 1 MHZ DIGIT AND 0FH LD (DE),A ;LOAD IN OUTBUF INC DE SUB A ;TEST IF DECIMAL POINT NEEDED ADD A,B JR Z,40$ ;BRANCH IF NOT, NO FRACTIONAL PART 30$ LD A,'.' ;LOAD DECIMAL POINT IN OUTBUF LD (DE),A INC DE 35$ DEC HL ;POINT TO NEXT LOWER DIGITS LD A,(HL) ;GET UPPER NIBBLE CALL SHFTR4 LD (DE),A ;LOAD INTO OUTBUF INC DE DEC B ;TEST FRACTIONAL DIGITS COUNTER JR Z,40$ ;BRANCH IF DONE LD A,(HL) ;GET LOWER NIBBLE AND 0FH LD (DE),A ;LOAD INTO OUTBUF INC DE DEC B JR NZ,35$ ;BRANCH BACK IF MORE 40$ LD HL,RXSTAT+2 BIT 2,(HL) JR Z,50$ ;BRANCH IF NOT OVERIDE MODE LD A,'D' ;ELSE OUTPUT OVERIDE DETECTOR DATA LD (DE),A INC DE LD A,'=' ; WITH "=" SIGN LD (DE),A INC DE LD A,(DETECT) CP 1 ;CONVERT DATA TO OUTPUT CODE JR Z,45$ XOR 1 45$ LD (DE),A INC DE LD A,'I' ;NOW OUTPUT OVERIDE FILTER DATA LD (DE),A INC DE LD A,'=' ; WITH "=" SIGN LD (DE),A INC DE LD A,(FILTER) ;GET OVERIDE FILTER LD (DE),A ;LOAD IT INC DE JR 65$ ;BRANCH TO CONTINUE 50$ BIT 5,C ;TEST IF DETECTOR NEEDED JR Z,60$ ;BRANCH IF NOT LD A,'D' ;LOAD DETECTOR PREFIX LD (DE),A INC DE LD A,(DETECT) ;GET DETECTOR DATA AND A ;CONVERT TO OUTPUT CODE JR NZ,55$ LD A,8 55$ LD (DE),A ;STORE DETECTOR IN OUTBUF INC DE 60$ BIT 4,C ;TEST IF FILTER NEEDED JR Z,65$ ;BRANCH IF NOT LD A,'I' ;LOAD FILTER PREFIX LD (DE),A INC DE LD A,(FILTER) ;LOAD FILTER DATA CALL FILOUT 65$ BIT 3,C ;TEST IF AGC NEEDED JR Z,70$ ;BRANCH IF NOT LD A,'M' ;LOAD AGC PREFIX LD (DE),A INC DE LD A,(AGC) ;GET AGC DATA AND 7 ;ISOLATE MAIN IF AGC DATA LD (DE),A ;STORE DATA IN OUTBUF INC DE 70$ BIT 2,C ;SEE IF BFO NEEDED JR Z,85$ ;BRANCH IF NOT LD A,'B' ;LOAD BFO PREFIX LD (DE),A INC DE LD HL,BFOWRK ;GET BFO LSD'S TO B REG LD B,(HL) INC HL LD A,(HL) ;GET BFO MSD'S BIT 7,A ;SEE IF NEGATIVE JR Z,75$ ;BRANCH IF POSITIVE LD A,'-' ;ELSE LOAD OUTBUF WITH MINUS SIGN LD (DE),A INC DE SUB A ;COMPLEMENT BFO SUB B DAA ;LSD'S DONE LD B,A LD A,0 ;CLEAR ACCUMULATOR WITHOUT DESTROYING CARRY SBC A,(HL) DAA ;MSD DONE 75$ LD (DE),A ;SAVE BFO MSD IN OUTBUF INC DE AND A ;SEE IF MSD IS ZERO LD A,B ;PRE-LOAD LSD'S JR NZ,80$ ;BRANCH IF MSD NOT ZERO AND A ;ELSE SEE IF FRACTIONAL PART JR Z,85$ ;BRANCH IF NO, BFO = 0 DEC DE ;ELSE OVERWRITE LEADING ZERO 80$ AND A ;TEST IF FRACTIONAL PART JR Z,85$ ;BRANCH IF NOT LD A,'.' ;LOAD OUTBUF WITH DECIMAL POINT LD (DE),A INC DE LD A,B ;LOAD 100 HZ DIGIT CALL SHFTR4 LD (DE),A INC DE LD A,B ;LOAD 10 HZ DIGIT IF NOT ZERO AND 0FH JR Z,85$ ;BRANCH OUT IF ZERO LD (DE),A ;ELSE LOAD IN OUTBUF INC DE 85$ BIT 1,C ;TEST IF ATTENUATION FACTOR NEEDED RET Z ;RETURN IF NOT LD A,'A' ;ELSE LOAD ATTENUATION PREFIX IN OUTBUF LD (DE),A INC DE LD A,(MGCLVL) ;NOW LOAD REMOTE MGC LEVEL IN OUTBUF CPL ;COMPLEMENT IT FIRST CALL BCDLD RET ;DONE ;THIS ROUTINE LOADS THE OUTPUT BUFFER WITH FILTER DATA FROM THE FILTER ;DEFINITION TABLE "FILTAB". ENTERED WITH THE ACCUMULATOR INDICATING THE ;SYMMETRICAL FILTER SLOT FOR OUTPUT. ; FILOUT LD L,A ;TRIPLE FILTER NUMBER AND AUGMENT FILTAB RLCA ; POINTER ADD A,L LD HL,FILTAB CALL ADC LD B,2 ;TEST FOR LEADING KHZ ZEROES IN 2 LOOP PASSES 5$ LD A,(HL) ;BRANCH IF UPPER NIBBLE NOT ZERO CALL SHFTR4 JR NZ,15$ LD A,(HL) ;BRANCH IF LOWER NIBBLE NOT ZERO AND 0FH JR NZ,20$ INC HL ;ELSE TRY 10K, 1K FILTER DIGITS IF STILL TO DO DJNZ 5$ JR 25$ ;ELSE GO OUTPUT FRACTIONAL KHZ DIGITS 10$ LD A,(HL) ;OUTPUT UPPER NIBBLE DIGIT CALL SHFTR4 15$ LD (DE),A INC DE LD A,(HL) ;OUTPUT LOWER NIBBLE DIGIT AND 0FH 20$ LD (DE),A INC DE INC HL DJNZ 10$ ;DO BOTH INTEGER KHZ BYTES IF NEEDED SUB A ;TEST FRACTIONAL KHZ DIGITS ADD A,(HL) RET Z ;DONE IF NONE 25$ LD A,'.' ;OUTPUT DECIMAL POINT LD (DE),A INC DE LD A,(HL) ;OUTPUT 100 HZ FILTER DIGIT CALL SHFTR4 LD (DE),A INC DE LD A,(HL) ;OUTPUT 10 HZ FILTER DIGIT IF NOT ZERO AND 0FH RET Z LD (DE),A INC DE RET ;DONE ;THIS ROUTINE LOADS THE DATA THAT WAS INPUT FROM THE REMOTE ;INPUT SYSTEM ; RCOMEX LD HL,COMBYT ;GET COMBYT LD A,(HL) LD (HL),0 ;CLEAR OLD STORAGE LD DE,MGCLVL ;SET UP INITIAL DATA POINTERS LD HL,RXSTAT ;TEST IF BITE ACTIVE BIT 2,(HL) JR Z,5$ ;BRANCH IF NOT ACTIVE LD DE,BBUFF+9 ;ELSE RELOCATE POINTER TO DATA IN BITE BUFFER 5$ BIT 7,A ;BITE REQUESTED? JR Z,10$ ;BRANCH IF NOT SET 1,(HL) ;ELSE SET BITE NEEDED FLAG JR 15$ 10$ BIT 0,A ;BITE TERMINATION REQUESTED? JR Z,15$ ;BRANCH IF NOT BIT 2,(HL) ;VERIFY BITE ACTIVE JR Z,15$ ;BRANCH IF NOT RES 1,(HL) ;ELSE KILL BITE NEEDED FLAG 15$ LD HL,INMGC LD BC,1 ;PREPARE TO MOVE 1 BYTE OF MGC DATA BIT 1,A ; IF NEEDED CALL INMOV LD BC,4 ;MOVE FREQ DATA IF NEEDED BIT 6,A CALL INMOV LD BC,2 ;BFO BIT 2,A CALL INMOV LD BC,1 ;DETECTOR BIT 5,A CALL INMOV LD BC,1 ;AGC BIT 3,A CALL INMOV LD BC,1 ;FILTER BIT 4,A CALL INMOV RET ;DONE ; ; ;SUBROUTINE FOR RCOMEX TO EITHER TRANSFER NEEDED DATA OR ;READJUST POINTERS FOR NEXT DATA GROUP ; INMOV JR Z,5$ ;BRANCH IF DATA NOT NEEDED LDDR ;TRANSFER DATA RET ;DONE 5$ LD B,C ;RESET SINGLE REG POINTER 10$ DEC HL ;ADJUST POINTERS DEC DE DJNZ 10$ RET ;DONE ;ROUTINE TO LOAD THE OUTPUT BUFFER WITH UP TO 3 DIGITS ;REPRESENTING A BYTE OF BINARY DATA ; BCDLD PUSH BC ;SAVE BC REGS LD B,0 ;PRESET NO "100" DIGIT FLAG LD C,A ;SAVE NUMBER IN C REG CP 200 ;SEE IF NUMBER UNDER 200 JR C,5$ ;BRANCH IF YES SUB 100 ;ELSE REMOVE 100 AND INCREASE B REG INC B 5$ CP 100 ;SEE IF NUMBER UNDER 100 JR C,10$ ;BRANCH IF YES INC B ;ELSE INCREASE "100" DIGIT FLAG SUB 100 ;SUBTRACT 100 FROM NUMBER LD C,A ;UPDATE C REG LD A,B ;LOAD "100" DIGIT IN OUTBUF LD (DE),A INC DE 10$ CALL BINDEC ;CONVERT REST OF NUMBER TO BCD LD HL,BCDWRK LD A,(HL) CALL SHFTR4 JR NZ,15$ ;OUTPUT "10" DIGIT IF NON-ZERO ADD A,B ;ELSE TEST IF LEADING ZERO JR Z,20$ ;BRANCH IF YES, IGNORE SUB A ;ELSE LOAD 0 IN OUTBUF 15$ LD (DE),A ;OUTPUT "10" DIGIT TO OUTBUF INC DE 20$ LD A,(HL) ;GET "1" DIGIT, STORE IN OUTBUF AND 0FH LD (DE),A INC DE POP BC ;RETRIEVE BC REGS RET ;DONE ;THIS ROUTINE ACCEPTS A STRING OF NUMERICAL DATA AND LOADS A WORK AREA ;WITH THESE DIGITS IN PACKED BCD FORMAT ; GETBCD LD HL,INWRK ;POINT TO WORKSPACE LD (HL),0FFH ;LOAD STOP BLOCK LD B,5 ;CLEAR REMAINDER OF WORKSPACE 5$ INC HL LD (HL),0 DJNZ 5$ 10$ CALL G1CR ;GET DATA CHARACTER JR NZ,15$ ;BRANCH IF NOT NUMERIC DEC HL ;ELSE SHIFT IN NEW INTEGER RLD INC HL RLD JR 10$ ;GO BACK FOR MORE 15$ CP '.' ;DONE IF NON-NUMERIC CHAR NOT DECIMAL POINT RET NZ LD HL,INWRK+3 ;ELSE POINT TO FRACTIONAL STORAGE 20$ CALL G1CR ;GET DATA RET NZ ;DONE IF NOT NUMERIC RRD ;ELSE STORE IN WORKSPACE CALL G1CR ;GET NEXT CHARACTER RET NZ ;DONE IF NOT NUMERIC ADD A,(HL) ;ELSE STORE IN WORKSPACE LD (HL),A DEC HL ;ADJUST WORKSPACE POINTER FOR MORE DATA SUB A ;TEST WORKSPACE, GO BACK IF MORE ALLOWED ADD A,(HL) JR Z,20$ 25$ CALL G1CR ;ELSE PURGE NUMBERS, RETURN WITH LATEST RET NZ ; NON-NUMERIC CHARACTER IN A & C JR 25$ ;THIS ROUTINE ACCEPTS A STRING OF DIGITS AND CONVERTS ;THE SUM INTO ITS BINARY EQUIVALENT ; GETNUM LD HL,INWRK ;POINT TO WORK AREA SUB A ;CLEAR WORK SPACE 5$ LD (HL),A ;UPDATE WORK SPACE CALL G1CR ;GET NEXT DIGIT RET NZ ;RETURN IF NEW DATA NOT NUMERIC LD A,(HL) ;ELSE MULTIPLY OLD DATA X10 ADD A,A ADD A,A ADD A,(HL) ADD A,A ADD A,C ;ADD IN NEW DATA JR 5$ ;GO BACK FOR MORE ;THIS ROUTINE TAKES A BYTE OF SIGNED INFORMATION ;AND CREATES ITS 10'S COMPLEMENT REPRESENTATION IN 8 PACKED BCD DIGITS. ;INPUT IN C, OUTPUT IN BCDWRK (4 BYTES). ;DESTROYS ACCUMULATOR ONLY ; ; BINDEC PUSH HL ;SAVE HL PAIR LD HL,CVRTBL ;POINT TO CONVERSION TABLE LD A,C ;GET VALUE TO BE CONVERTED CALL SHFTR4 ;GET UPPER NIBBLE ADD A,A ;X2 CALL ADC ;USE IT TO AUGMENT POINTER LD A,C ;GET LOWER NIBBLE AND 15 ADD A,0 ;SET CONDITION CODES DAA ;MAKE BCD ADD A,(HL) ;ADD IN TABLE VALUE DAA ;MAKE TOTAL BCD LD (BCDWRK),A ;SAVE IN TEMP. STORAGE INC HL ;POINT TO SECOND TABLE ENTRY LD A,(HL) ;GET IT ADC A,0 ;ADD IN CARRY DAA ;MAKE BCD LD (BCDWRK+1),A ;SAVE IN TEMP STORAGE CALL SHFTR4 ;"SIGN EXTEND" FINAL VALUE LD H,A CALL SHFTL4 ADD A,H LD (BCDWRK+2),A LD (BCDWRK+3),A POP HL ;RESET HL PAIR RET ;RETURN ;ROUTINE TO CONVERT A 16 BIT UNSIGNED BINARY NUMBER (0 - 65535) ;TO ITS 5 DIGIT BCD REPRESENTATION. ENTERED WITH NUMBER TO BE ;CONVERTED IN HL. EXIT WITH HL POINTING TO MSD OF ANSWER. ; BINBCD PUSH DE ;SAVE REGS PUSH BC LD B,3 ;CLEAR ACCUMULATOR LD DE,BCDWRK SUB A 5$ LD (DE),A INC DE DJNZ 5$ LD DE,BCDTBL ;POINT TO ADDEND TABLE 10$ XOR A ;RESET THE CARRY BIT ADC HL,HL ;SHIFT UP THE BINARY WORD INTO THE CARRY JR C,15$ ;BRANCH IF MUST ADD IN ADDEND JR Z,25$ ;DONE IF ALL BITS SHIFTED OUT INC DE ;UPDATE ADDEND POINTER INC DE INC DE JR 10$ ;GO DO NEXT BIT 15$ PUSH HL ;SAVE REST OF BITS LD HL,BCDWRK ;POINT TO ACCUMULATOR LD B,3 ;ADD 3 BYTES OF ADDEND TO ACCUMULATOR XOR A ;CLEAR INITIAL CARRY 20$ LD A,(DE) ;GET ADDEND ADC A,(HL) ;ADD TO ACCUMULATOR DAA ;KEEP IT BCD LD (HL),A ;MOVE BACK TO ACCUMULATOR INC HL ;UPDATE POINTERS INC DE DJNZ 20$ ;DO ALL 3 ADDITIONS POP HL ;RETRIEVE WORD TO BE CONVERTED JR 10$ ;GO TEST NEXT BIT 25$ LD HL,BCDWRK+2 ;FINISH WITH HL POINTING TO BCD MSD POP BC ;RESTORE REGS POP DE RET ;DONE ;THIS ROUTINE TESTS IF THE ACTIVE AUDIO IS ISB (ISB-LSB OR LSB WITH ISB ;INSTALLED). RETURNS WITH Z FLAG SET IF YES. ; TSTAUD CALL TSTISB ;ISB INSTALLED ? RET NZ ;DONE IF NOT LD A,(DETECT) ;ISB-L ? CP 5 RET Z ;RETURN IF YES CP 6 ;LSB WITH ISB INSTALLED ? RET ;RETURN WITH ANSWER ; ; ;THIS ROUTINE TESTS WHETHER ISB IS INSTALLED. RETURNS WITH Z FLAG SET IF YES. ; TSTISB IN A,(95H) ;TEST OPTION BITS AND 48H CP 40H RET ;RETURN WITH ANSWER ;THIS ROUTINE PAUSES HERE UNTIL ALL THE FRONT PANEL KEYSWITCHES ;HAVE BEEN RELEASED ; UNBUTN IN A,(0) CP 0FFH JR NZ,UNBUTN IN A,(1) CP 0FFH JR NZ,UNBUTN RET ;THIS ROUTINE SHIFTS THE VALUE IN THE ACCUMULATOR ;DOWN ONE NIBBLE, DESTROYING THE ORIGINAL BOTTOM NIBBLE. ; SHFTR4 RRCA ;SHIFT UPPER NIBBLE DOWN RRCA RRCA RRCA AND 0FH ;CLEAR UPPER NIBBLE RET ;RETURN ;THIS ROUTINE SHIFTS THE ACCUMULATOR UP ONE NIBBLE, ;DESTROYING THE ORIGINAL UPPER NIBBLE. ; SHFTL4 RLCA ;SHIFT LOWER NIBBLE UP RLCA RLCA RLCA AND 0F0H ;CLEAR BOTTOM NIBBLE RET ;RETURN ;THIS ROUTINE ADDS THE CONTENTS OF THE ACCUMULATOR TO THE HL ;REGISTER PAIR ; ADC PUSH DE ;SAVE ORIGINAL DE LD D,0 ;LOAD DE WITH ACCUMULATOR VALUE LD E,A ADD HL,DE ;ADD TO HL POP DE ;RESTORE ORIGINAL DE RET ;DONE ;ENTER WITH HL POINTING TO DATA TO BE SHIFTED UP. (DESTROYS ACCUMULATOR) ; SHFBCD SUB A ;CLEAR ACCUMULATOR TO SHIFT 0'S IN LSD PUSH HL ;SAVE HL FOR RELOAD AT END RLD ;SHIFT FIRST BYTE INC HL RLD ;SHIFT SECOND BYTE INC HL RLD ;SHIFT THIRD BYTE INC HL RLD ;SHIFT FOURTH BYTE POP HL ;RESET HL TO ENTRY POSITION RET ;RETURN ;THIS TABLE IS USED BY THE INPUT SYSTEM TO MATCH ;INPUT COMMANDS AND TO VECTOR TO PROPER DISPATCH ROUTINES. ; COMLET DEFB 'F' ;FREQUENCY DEFW FRQIN DEFB 'D' ;DETECTOR DEFW DETIN DEFB 'I' ;FILTER DEFW FILIN DEFB 'M' ;AGC MODE DEFW AGCIN DEFB 'B' ;BFO FREQUENCY DEFW BFOIN DEFB 'A' ;IF ATTENUATION (MGC VOLTAGE LEVEL) DEFW ATNIN DEFB 'S' ;STATUS DEFW STATIN DEFB 'T' ;SELECTIVE TALKER DEFW SELIN DEFB 'G' ;GROUP TALKER DEFW TLKIN DEFB '$' ;UNLISTEN COMMAND DEFW UNLSTN DEFB 13 ;TERMINATOR DEFW ENDIN DEFB 0 ;END OF TABLE ;THESE ARE THE STATIN ROUTINE ADDRESSES ; STATBL DEFW ERLOG ; S0 = ERROR DEFW SETLOC ; S1 = SET LOCAL DEFW SETRMT ; S2 = SET REMOTE DEFW EXCBIT ; S3 = EXECUTE BITE DEFW TRMBIT ; S4 = TERMINATE BITE DEFW RPTBW ; S5 = REPORT BANDWIDTHS DEFW RPTBIT ; S6 = REPORT BITE RESULTS DEFW FFILSU ; S7 = FORCE FILTER SETUP DEFW RAGCDP ; S8 = ALLOW REMOTE AGC DUMP DEFW RAGCOF ; S9 = INHIBIT REMOTE AGC DUMP ;TABLE TO TRANSFORM INPUT AGC CODES TO RECEIVER ;COMPATIBLE CODES ; AGCTRN DEFB 9 ;SHORT AGC DEFB 12H ;MEDIUM AGC DEFB 1BH ;LONG AGC DEFB 4 ;MGC DEFB 0DH ;SHORT AGC, VAR THRESHOLD DEFB 16H ;MEDIUM AGC, VAR THRESHOLD DEFB 1FH ;LONG AGC, VAR THRESHOLD ;THESE TWO TABLES ARE USED BY SMDET TO INCREMENT THE DETECTOR TO THE NEXT ;LOGICAL CHOICE. THE FIRST IS USED WHEN ISB IS NOT INSTALLED, THE SECOND WHEN ;ISB IS INSTALLED. ; DETNRM DEFB 7 ;ILLEGAL PRESENT ISB-U -- SWITCH TO USB DEFB 2 ;UPDATE AM INPUT TO FM DEFB 3 ;FM TO CW VAR DEFB 4 ;CW VAR TO CW FIXED DEFB 6 ;CW FIXED TO LSB DEFB 6 ;ILLEGAL PRESENT ISB-L -- SWITCH TO LSB DEFB 7 ;LSB TO USB DEFB 1 ;USB TO AM ; ; DETISB DEFB 1 ;ISB-U TO AM DEFB 2 ;AM TO FM DEFB 3 ;FM TO CW VAR DEFB 4 ;CW VAR TO CW FIXED DEFB 6 ;CW FIXED TO LSB DEFB 0 ;ISB-L TO ISB-U DEFB 7 ;LSB TO USB DEFB 5 ;USB TO ISB-L ;THESE TABLES ARE USED BY THE SETRCR ROUTINES TO CONVERT FROM LOGICAL TO ;PHYSICAL CONFIGURATION, CALCULATE PROPER LO OFFSETS, ETC. ; ;THIS FIRST TABLE RETURNS A DETECTOR TYPE (0-3) FOR A DETECTOR PARAMETER (0-7) ;(USED BY SETUP) ; DETTYP DEFB 3 ;ISB-U DEFB 0 ;AM DEFB 0 ;FM DEFB 0 ;CW VARIABLE DEFB 0 ;CW FIXED DEFB 3 ;ISB-L DEFB 1 ;LSB DEFB 2 ;USB ; ; ;THIS TABLE CONVERTS THE LOGICAL DETECTOR PARAMETER INPUT TO ITS HARDWARE ;CONFIGURATION (USED BY SETDET) ; CVTDET DEFB 30H ;ISB-U DEFB 38H ;AM DEFB 28H ;FM DEFB 30H ;CW VARIABLE DEFB 30H ;CW FIXED DEFB 30H ;ISB-L DEFB 30H ;LSB DEFB 30H ;USB ; ; ;THIS TABLE CONVERTS THE FILTER SLOT NUMBER TO ITS SINGLE LINE HARDWARE ;CONFIGURATION FORM (USED BY SETFIL) ; CVTFIL DEFB 20H ;BYPASS DEFB 1 ;FL1 DEFB 2 ;FL2 DEFB 4 ;FL3 DEFB 8 ;FL4 DEFB 10H ;FL5 ; ; ;THIS TABLE CONVERTS A LOGICAL AGC PARAMETER TO ITS PHYSICAL HARDWARE ;CONFIGURATION. (USED BY BOTH MAIN AND ISB AGC). ; CVTAGC DEFB 16H ;SPECIAL ISB AGC SHORT FOR MAIN AGC ROLLOVER DEFB 16H ;SHORT AGC DEFB 18H ;MEDIUM DEFB 10H ;LONG DEFB 66H ;MANUAL DEFB 46H ;MANUAL SHORT DEFB 48H ;MANUAL MEDIUM DEFB 40H ;MANUAL LONG ; ; ;THIS TABLE DEFINES THE AUDIO CROSSPOINT SWITCH SETTINGS AS A FUNCTION OF ;DETECTOR MODE ; AUDCP DEFW 8821H ;ISB-U DEFW 4414H ;AM DEFW 8801H ;FM DEFW 8801H ;CW VAR DEFW 8801H ;CW FIXED DEFW 4421H ;ISB-L DEFW 8801H ;LSB (NO ISB) DEFW 8801H ;USB DEFW 4424H ;LSB (ISB FITTED) ; ; ;THIS TABLE RELATES THE DETECTOR / FILTER COMBINATIONS WITH THE PROPER FIRST ;LO OFFSET (USED BY SETFRQ) ; LOFSET DEFB 50H ;SYMM. FILTER -- AM, FM, CW DETECTOR MODE DEFB 32H ; -- LSB DEFB 68H ; -- USB DEFB 50H ; -- ISB DEFB 68H ;LSB FILTER -- AM, FM, CW DEFB 50H ; -- LSB DEFB 50H ; -- USB DEFB 50H ; -- ISB DEFB 32H ;USB FILTER -- AM, FM, CW DEFB 50H ; -- LSB DEFB 50H ; -- USB DEFB 50H ; -- ISB ; ; ;THIS TABLE RELATES THE DETECTOR / FILTER COMBINATIONS WITH THE PROPER ;BFO OFFSET (USED BY SETBFO) ; BFOFST DEFB 50H ;SYMM. FILTER -- AM, FM, CW DETECTOR MODE DEFB 68H ; -- LSB DEFB 32H ; -- USB DEFB 50H ; -- ISB DEFB 32H ;LSB FILTER -- AM, FM, CW DEFB 50H ; -- LSB DEFB 50H ; -- USB DEFB 50H ; -- ISB DEFB 68H ;USB FILTER -- AM, FM, CW DEFB 50H ; -- LSB DEFB 50H ; -- USB DEFB 50H ; -- ISB ;THIS TABLE CONTAINS THE STANDARD VALUES FOR THE BASEBAND CONVERTER REGS. ;THEY ARE OUTPUT DURING RX INITIALIZATION VIA THE LD3LO ROUTINE. ; LO3TBL DEFB 70H,63H,52H ;REFERENCE REG FOR DIVIDE BY 100 (50 X 2) DEFB 40H,3AH ;A COUNTER = 10 DEFB 23H,19H,4 ;N COUNTER = 229 ;THE FOLLOWING TABLE IS USED BY THE ;BINARY TO BCD CONVERT ROUTINE. (BINDEC) ; CVRTBL DEFB 0 ;0 DEFB 0 DEFB 16H ;16 DEFB 0 DEFB 32H ;32 DEFB 0 DEFB 48H ;48 DEFB 0 DEFB 64H ;64 DEFB 0 DEFB 80H ;80 DEFB 0 DEFB 96H ;96 DEFB 0 DEFB 12H ;112 DEFB 1 DEFB 72H ;-128 DEFB 98H DEFB 88H ;-112 DEFB 98H DEFB 4 ;-96 DEFB 99H DEFB 20H ;-80 DEFB 99H DEFB 36H ;-64 DEFB 99H DEFB 52H ;-48 DEFB 99H DEFB 68H ;-32 DEFB 99H DEFB 84H ;-16 DEFB 99H ;THIS TABLE IS USED BY BINBCD TO CONVERT A 16 BIT UNSIGNED BINARY NUMBER ;TO ITS BCD EQUIVALENT. ; BCDTBL DEFB 68H ;32768 (2^15) DEFB 27H DEFB 3 DEFB 84H ;16384 (2^14) DEFB 63H DEFB 1 DEFB 92H ;8192 (2^13) DEFB 81H DEFB 0 DEFB 96H ;4096 (2^12) DEFB 40H DEFB 0 DEFB 48H ;2048 (2^11) DEFB 20H DEFB 0 DEFB 24H ;1024 (2^10) DEFB 10H DEFB 0 DEFB 12H ;512 (2^9) DEFB 5 DEFB 0 DEFB 56H ;256 (2^8) DEFB 2 DEFB 0 DEFB 28H ;128 (2^7) DEFB 1 DEFB 0 DEFB 64H ;64 (2^6) DEFB 0 DEFB 0 DEFB 32H ;32 (2^5) DEFB 0 DEFB 0 DEFB 16H ;16 (2^4) DEFB 0 DEFB 0 DEFB 8 ;8 (2^3) DEFB 0 DEFB 0 DEFB 4 ;4 (2^2) DEFB 0 DEFB 0 DEFB 2 ;2 (2^1) DEFB 0 DEFB 0 DEFB 1 ;1 (2^0) DEFB 0 DEFB 0 ;THE FOLLOWING TWO TABLES PROVIDE THE CURVES FOR ;THE AUDIO AND RF METERING DISPLAYS ; MTRAUD DEFB 27 ; -8 DB DEFB 9 ; -6 DB DEFB 10 ; -4 DB DEFB 11 ; -2 DB DEFB 14 ; 0 DB DEFB 19 ; 2 DB DEFB 26 ; 4 DB DEFB 19 ; 6 DB DEFB 40 ; 8 DB DEFB 62 ; 10 DB DEFB 0FFH ; END OF RANGE ; ; MTRRF DEFB 3 ; -120 TO -110 DBM INPUT SIGNAL LEVEL DEFB 5 ; -110 DEFB 9 ; -100 DEFB 16 ; -90 DEFB 17 ; -80 DEFB 12 ; -70 DEFB 12 ; -60 DEFB 12 ; -50 DEFB 12 ; -40 DEFB 12 ; -30 DEFB 12 ; -20 DEFB 12 ; -10 DEFB 0FFH ; END OF RANGE ;THIS TABLE IS USED BY SETDSP TO VECTOR TO THE PROPER DISPLAY UTILITY ; DSPTBL DEFW PRMON ;SETDSP PRINT MONITOR DATA ROUTINE DEFW PRFALT ; PRINT OOL FAULT ERRORS DEFW PRMETR ; PRINT METER CHOICE DEFW PRFILT ; PRINT FILTER DEFW PRAGC ; PRINT AGC DEFW PRFREQ ; PRINT FREQUENCY DEFW PRDET ; PRINT DETECTOR DEFW PRREFS ; PRINT REF SOURCE SELECTION (EXT / INT) DEFW PRREFV ; PRINT REF VALUE SELECTION (1,5,10 MHZ) DEFW PROVRD ; PRINT OVERRIDE MESSAGE DEFW PRFORF ; PRINT FORCE FILTER VALUE ;THIS TABLE IS USED BY THE SUBMODE KEY ROUTINE TO VECTOR TO THE PROPER ;SUBMODE UTILITY ; ADRTBL DEFW SMMETR ;SUBMODE METER UTILITY ADDRESS DEFW SMFILT ; FILTER DEFW SMAGC ; AGC DEFW SMFREQ ; FREQUENCY DEFW SMDET ; DETECTOR DEFW SMREFS ; REF SOURCE SELECT DEFW SMREFV ; REF VALUE SELECT DEFW KYSWRT ; SLOT FOR OVERRIDE (NOT USED) DEFW SMFORF ; FORCE FILTER ;THESE ARE THE CANNED DISPLAY MESSAGES ; BLANKS DEFB ' ' OVRMSG DEFB ' OVERRIDE REM' FFMSG DEFB 'FL =' RFMSG DEFB ' RF ' AFMSG DEFB ' AUDIO ' BITDSP DEFB 'BITE' DEFB 'TESTING ' BERMSG DEFB 'ERROR ' ; ;THESE ARE THE OOL MESSAGES ; BASOOL DEFB '3RD LO FAULT' BFOOOL DEFB 'BFO FAULT ' REFOOL DEFB '2ND LO FAULT' LOOOL DEFB 'SYNTH FAULT ' ; ;THESE ARE THE LOCK AND REMOTE FIELD MESSAGES ; LOKMSG DEFB 'LOK' ;LOCK REMMSG DEFB 'REM' ;REMOTE ; ; ;THESE ARE THE REFERENCE MESSAGES ; REFMSG DEFB 'INTERNAL ' ;REF SELECT INTERNAL DEFB 'EXTERNAL ' ;REF SELECT EXTERNAL DEFB ' 1 MHZ ' ;REF EXT 1 MHZ DEFB ' 5 MHZ ' ;REF EXT 5 MHZ DEFB '10 MHZ ' ;REF EXT 10 MHZ ; ; ;THESE ARE THE MODE DISPLAY MESSAGES ; MODMSG DEFB 'MONI' ;MONITOR MODE DISPLAY DEFB 'FALT' ;OOL ERRORS DEFB 'METR' ;METER DEFB 'FILT' ;FILTER DEFB 'AGC ' ;AGC DEFB 'FREQ' ;FREQUENCY DEFB 'DET ' ;DETECTOR DEFB 'REF ' ;REF SOURCE SELECT DEFB 'FREQ' ;REF VALUE SELECT DEFB 'OVRD' ;OVERRIDE ; ; ;THESE ARE THE CANNED AGC FORMAT MESSAGES ; AGCFMT DEFB 'SHORT ' ;SPECIAL ISB AGC SHORT FOR MAIN AGC ROLLOVER DEFB 'SHORT ' ;SHORT DEFB 'MEDIUM ' ;MEDIUM DEFB 'LONG ' ;LONG DEFB 'MANUAL ' ;MANUAL DEFB 'SHORT VAR' ;SHORT VARIABLE DEFB 'MED VAR ' ;MEDIUM VARIABLE DEFB 'LONG VAR ' ;LONG VARIABLE ; ; ;THESE ARE THE CANNED DETECTOR FORMAT MESSAGES ; DETFMT DEFB 'ISB UPPER' ;ISB-U DEFB 'AM ' ;AM DEFB 'FM ' ;FM DEFB 'CW +0.00 ' ;CW VARIABLE DEFB 'CW +0. ' ;CW FIXED DEFB 'ISB LOWER' ;ISB-L DEFB 'LSB ' ;LSB DEFB 'USB ' ;USB ; ; ;THESE CANNED MESSAGES ARE USED TO SET UP A GENERIC FILTER DISPLAY. THE ;ACTUAL VALUES REPLACE THE "X"S LATER. ; FILFMT DEFB '0 HZ ' ;0 HZ FORMAT DEFB 'X0 HZ ' ;10 HZ FORMAT DEFB 'XX0 HZ ' ;100 HZ FORMAT DEFB 'X.XX KHZ ' ;1 KHZ FORMAT DEFB 'XX.X KHZ ' ;10 KHZ FORMAT DEFB 'XXX KHZ ' ;100 KHZ FORMAT DEFB 'X.XX MHZ ' ;1 MHZ FORMAT DEFB 'NULL SLOT' ;NULL FILTER SLOT DEFB 'LSB FILT ' ;LSB FILTER SLOT DEFB 'USB FILT ' ;USB FILTER SLOT DEFB 'BYPASS ' ;FILTER BYPASS SLOT ;THIS DATA TABLE CONTAINS FOUR BYTES OF DATA ;FOR EACH SWITCH. THE FIRST BYTE CONTAINS ;THE MASK FOR ISOLATING THE DESIRED BIT FROM THE ;SWITCH PORT, WHILE THE SECOND CONTAINS THE PORT ;LSD IN BIT 0, AND THE REMOTE EXCLUSION BIT ;IN BIT 4. THE THIRD AND FOURTH BYTE CONTAIN THE ;ADDRESS OF THE DISPATCH ROUTINE. ; SWDTBL DEFB 4 ;0 DEFB 11H DEFW KYNUM DEFB 20H ;1 DEFB 11H DEFW KYNUM DEFB 8 ;2 DEFB 11H DEFW KYNUM DEFB 2 ;3 DEFB 11H DEFW KYNUM DEFB 10H ;4 DEFB 10H DEFW KYNUM DEFB 4 ;5 DEFB 10H DEFW KYNUM DEFB 1 ;6 DEFB 10H DEFW KYNUM DEFB 20H ;7 DEFB 10H DEFW KYNUM DEFB 8 ;8 DEFB 10H DEFW KYNUM DEFB 2 ;9 DEFB 10H DEFW KYNUM DEFB 1 ;ENTER DEFB 11H DEFW KYENT DEFB 80H ;MODE DEFB 0 DEFW KYMODE DEFB 40H ;SUBMODE DEFB 0 DEFW KYSMOD DEFB 80H ;TUNE DEFB 11H DEFW KYTUN DEFB 40H ;LOCK DEFB 11H DEFW KYLOCK DEFB 10H ;REMOTE DEFB 1 DEFW KYREM ;SPECIAL SECONDARY LOCK FUNCTIONS DISPATCH ROUTINE ADDRESS TABLE ; SPCTBL DEFW KYSPC0 ;START BITE, STOP ON EACH TEST DEFW KYSPC1 ;START NORMAL BITE DEFW KYSWRT DEFW KYSWRT DEFW KYSWRT DEFW KYSPC5 ;FORCE FILTERS DEFW KYSPC6 ;SET REF SOURCE SELECT MODE DEFW KYSWRT DEFW KYSPC8 ;SET SCAN UP FLAG DEFW KYSPC9 ;SET SCAN DOWN FLAG ;MONITOR KEYSWITCH DISPATCH ROUTINE ADDRESS TABLE ; MONTBL DEFW KYMON0 ;DEPOSIT DATA DEFW KYMON1 ;TUNE ADDRESS MSB'S DEFW KYMON2 ;TUNE ADDRESS LSB'S DEFW KYMON3 ;TUNE DATA DEFW KYMON4 ;DISPLAY PORT DATA DEFW KYSWRT DEFW KYMON6 ;DISPLAY A/D DATA DEFW KYMON7 ;PANIC BUTTON DEFW KYMON8 ;DISPLAY PROGRAM, VERSION DEFW KYMON9 ;EXIT MONITOR ;THESE TABLES SUPPORT THE DISPLAY A/D DATA MONITOR ROUTINE ; MSVLBL DEFB 'DAFM' ;AUDIO DATA DEFB 1 ; BIT 0 DEFB 'ARFM' ;MAIN AGC DEFB 2 ; BIT 1 DEFB 'SPAR' ;SPARE INPUT DEFB 4 ; BIT 2 DEFB 'IMET' ;ISB AGC DEFB 8 ; BIT 3 DEFB 'XRFS' ;BITE 1 DEFB 10H ; BIT 4 DEFB 'MOS ' ;BITE 2 DEFB 20H ; BIT 5 DEFB 'SOS ' ;BITE 3 DEFB 40H ; BIT 6 DEFB 'AIIS' ;BITE 4 DEFB 80H ; BIT 7 ; ; MSVDSP DEFB ' UM OFF' ;UNMUTED, SIG GEN OFF DEFB 01000101B ;PORT 96 BITE BIT DATA (BITS 6,2,0) DEFB ' M OFF' ;MUTED, SIG GEN OFF DEFB 00000101B ;(BIT 6=XMAT, 2=RATT, 0=XBIT) DEFB ' UM -50' ;UNMUTED, -50 DB SIG GEN DEFB 01000000B DEFB ' M -50' ;MUTED, -50 DEFB 00000000B DEFB ' UM -10' ;UNMUTED, -10 DB SIG GEN DEFB 01000100B DEFB ' M -10' ;MUTED, -10 DEFB 00000100B ;THIS LIST DEFINES THE BITE TESTS AS AN AID IN UNDERSTANDING THE PURPOSE, ;AS WELL AS THE SPECIFIC HARDWARE SETUP OF EACH TEST LISTED IN THE TABLE BELOW. ;ALL TESTS USE THE WIDEST SYMMETRICAL FILTER SPECIFIED IN IFTRAN FOR TESTING ;EXCEPT FOR TESTS 40 - 44 WHICH TEST THE INDIVIDUAL FILTERS. EXCEPT FOR TEST ;16, WHICH TUNES TO 10.55 MHZ, ALL TESTS USE 100 KHZ, TUNED TO THE BITE TEST ;SIGNAL GENERATOR. ; ; ; T X R X ; E B A M ; S I T A XDAC DELAY SUSP ; T T T T GAIN VOLT MSEC TEST MOD ; ; 1 - - - ---- ---- 0 RAM TEST - CHECK ALL RAM OK A2 ; 2 1 1 1 SHORT 10.0 500 ROOL (4B31) = 0, CHECK REF OOL A6 ; 3 1 1 1 SHORT 10.0 0 LOOL (4C31) = 0, CHECK LO OOL A5 ; 4 1 1 1 SHORT 10.0 0 DBOL (4A30) = 1, CHECK BFO OOL A7 ; 5 1 1 1 MAN 4.0 1000 ARFM (4C10) > 2 V, VERIFY ABILITY A9 ; TO SET GAIN CONT VOLT IN MGC ; 6 1 1 1 MAN 4.0 0 ARFM (4C10) < 7 V, SAME TEST AS 5 A9 ; 11 1 1 0 SHORT 10.0 200 XRFS (4A15) < 1 V, A13 SIG DET DIS- A13 ; ABLED & RF MUTE ON - CHECK SIG ; DETECTOR IS OFF ; 13 0 0 0 SHORT 10.0 200 XRFS (4A15) > 1 V, SIG GEN -10, A13 ; CHECK A13 SIG DET OUTPUT IN ; VALID RANGE ; 15 1 0 0 SHORT 10.0 1000 XRFS (4A15) < 1 V, SIG GEN OFF, A13 ; CHECK DETECTOR OFF ; 16 0 0 0 SHORT 10.0 500 MOS (4A18) < 1 V, AT 15.55 MHZ, A12 ; CHECK A12 DETECTOR OFF ; 17 0 0 0 SHORT 10.0 200 MOS (4A18) > 1 V, AT 100 KHZ, A12 ; CHECK A12 SIG DET IN VALID RANGE ; 19 0 1 0 MAN 7.0 200 SOS (4C18) BETWEEN 3 V AND 7 V A11 ; SET MGC TO 7 V, ADJ GAIN IN ; MINIMUM STEPS (50 TRIES MAX) ; UNTIL 3 V < SOS < 7 V. ; 20 0 1 0 MAN AS ADJ 0 ARFM (4C10) > 4 V, CHECK GAIN A11 ; CONTROL VOLTAGE IN VALID RANGE ; 22 0 1 0 MAN 7.0 200 AIIS (4B18) BETWEEN 3 V AND 7 V A10 ; SET MGC TO 7 V, ADJ GAIN IN ; MINIMUM STEPS (50 TRIES MAX) ; UNTIL 3 V < AIIS < 7 V. ; 23 0 1 0 MAN AS ADJ 0 ARFM (4C10) > 4 V, CHECK GAIN A10 ; CONTROL VOLTAGE IN VALID RANGE ; -50 SIG GEN ; 25 0 0 0 SHORT 10.0 500 ARFM (4C10) > 2 V, SAME TEST AS 23 A9 ; WITH -10 SIG GEN ; 26 0 0 0 SHORT 10.0 0 ARFM (4C10) < 8 V, SAME TEST AS 25 A9 ; 27 0 0 0 MED 10.0 200 ARFM (4C10) > 2 V, SAME TEST AS 25 A9 ; 28 0 0 0 MED 10.0 0 ARFM (4C10) < 8 V, SAME TEST AS 25 A9 ; 29 0 0 0 LONG 10.0 200 ARFM (4C10) > 2 V, SAME TEST AS 25 A9 ; 30 0 0 0 LONG 10.0 0 ARFM (4C10) < 8 V, SAME TEST AS 25 A9 ; 31 0 1 0 SH VAR 10.0 500 ARFM (4C10) > 4 V, SAME TEST AS 25 A9 ; WITH -50 SIG GEN ; 33 1 1 0 SH VAR 10.0 500 ARFM (4C10) > 5 V, SIG GEN OFF, A9 ; CHECK GAIN CONTROL VOLT NEAR MAX ; 34 0 1 0 SH VAR 10.0 2000 DAFM (4B10) > 1.5 V, CHECK AF METER A7 ; IN VALID RANGE WITH -50 SIG GEN ; 35 0 1 0 SH VAR 10.0 0 DAFM (4B10) < 6.5 V, SAME TEST AS 34 A7 ; STORE DAFM VALUE FOR TEST 36 ; 36 0 0 0 SH VAR 10.0 2000 DAFM (4B10) VARIES < .5 V FROM A9 ; TEST 35 VALUE WITH -10 SIG GEN ; 38 0 1 0 SH VAR 10.0 4000 DAFM (4B10) < 2 V, -50 SIG GEN, A7 ; SELECT AM, CHECK NO AUDIO OUTPUT ; 39 0 1 0 SH VAR 10.0 4000 DAFM (4B10) < 2 V, -50 SIG GEN, A7 ; SELECT FM, CHECK NO AUDIO OUTPUT ; 40 0 1 0 SHORT 10.0 500 ARFM (4C10) VARIES < 1 V FOR FL1 A10 ; WHEN TESTED AGAINST REF ; 41 0 1 0 SHORT 10.0 500 ARFM (4C10) VARIES < 1 V FOR FL2 A10 ; 42 0 1 0 SHORT 10.0 500 ARFM (4C10) VARIES < 1 V FOR FL3 A10 ; 43 0 1 0 SHORT 10.0 500 ARFM (4C10) VARIES < 1 V FOR FL4 A10 ; 44 0 1 0 SHORT 10.0 500 ARFM (4C10) VARIES < 1 V FOR FL5 A10 ; 45 0 0 0 SHORT 10.0 500 IMET (4A10) < 8 V, BASEBAND A8 ; 46 0 0 0 SHORT 10.0 0 IMET (4A10) > 2 V, SAME TEST AS 45 A8 ;THIS TABLE DEFINES THE TEST PARAMETERS FOR EACH OF THE BITE TESTS. THE ;FIRST BYTE IN EACH TEST GROUP DEFINES THE BITE ERROR NUMBER, IN PACKED BCD ;FORMAT. THE SECOND BYTE DEFINES THE RECEIVER PARAMETERS THAT NEED TO BE ;SET UP PRIOR TO ACTUALLY RUNNING THE TEST, AND IS FOLLOWED BY BYTES THAT ;DEFINE THE ACTUAL PARAMETERS TO BE USED. THE NEXT TWO BYTES DEFINE THE ;ADDRESS OF THE INDIVIDUAL TEST ROUTINES, FOLLOWED BY BYTES DEFINING THE ;INDIVIDUAL TEST ROUTINE PARAMETERS. THE BIT DEFINITIONS OF THE SECOND ;BYTE IN EACH TEST GROUP ARE DEFINED BELOW : ; ; BIT 7 SET UP AGC (PORT 92) AND DAC LEVEL (PORT 2) (2 BYTES) ; 6 SET UP DETECTOR AND BITE CONTROL (PORT 96) (1 BYTE ) ; 5 SET UP FREQUENCY (4 BYTES) ; 4 DUMP AGC (0 BYTES) ; 3 DELAY REQUIRED (IN BLOCKS OF 20 MS) (1 BYTE ) ; 2 | ; 1 | NOT USED ; 0 | ; ; BITTAB DEFB 1,0 ;TEST 1 - RAM TEST - NO SETUP OR DELAY DEFW RAMTST ; - RAMTST ; DEFB 2,8 ;TEST 2 - REF OOL DEFB 25 ; - DELAY 500 MS, ALLOW REF TO SETTLE DEFW BITTST ; - BITTST DEFB 95H,2,0 ; - PORT 95, BIT 1, POLARITY = 0 ; DEFB 3,0 ;TEST 3 - MAIN LO OOL - NO SETUP OR DELAY DEFW BITTST ; - BITTST DEFB 95H,1,0 ; - PORT 95, BIT 0, POL=0 ; DEFB 4,0 ;TEST 4 - BFO OOL - NO SETUP OR DELAY DEFW BITTST ; - BITTST DEFB 95H,4,4 ; - PORT 95, BIT 2, POL=1 ; DEFB 5,88H ;TEST 5 - ARFM > 2V WITH 4V DAC IN MGC DEFB 36H,102,50 ; - MGC, 4V DAC, DELAY 1 SEC DEFW XGTK ; - XGTK DEFB 2,51 ; - BIT 1, 2V TEST REF LEVEL (REF) ; DEFB 6,0 ;TEST 6 - ARFM < 7V WITH 4V DAC IN MGC DEFW XLTK ; - XLTK DEFB 2,179 ; - BIT 1, 7V REF ; DEFB 11H,0C8H ;TEST 11- XRFS < 1V (SIG DET S/B OFF) DEFB 16H,255 ; - AGC SHORT, 10V DAC DEFB 35H,10 ; - PORT 96 (ZERO XMAT), DELAY 200 MS DEFW XLTK ; - XLTK DEFB 10H,25 ; - BIT 4, 1V REF ; DEFB 13H,48H ;TEST 13- XRFS > 1V WITH -10 DBM SIG GEN DEFB 30H,10 ; - PORT 96 (ZERO RATT,XBIT),DELAY 200 MS DEFW XGTK ; - XGTK DEFB 10H,25 ; - BIT 4, 1V REF ; DEFB 15H,48H ;TEST 15- XRFS < 1V WITH SIG GEN OFF DEFB 31H,50 ; - PORT 96 (SET XBIT), DELAY 1 SEC DEFW XLTK ; - XLTK DEFB 10H,25 ; - BIT 4, 1V REF ; DEFB 16H,68H ;TEST 16- MOS < 1V WITH TUNE OFF FREQ DEFB 30H ; - PORT 96 (ZERO XBIT) DEFB 0,0,55H,15H,25 ; - 15.55 MHZ, DELAY 500 MS DEFW XLTK ; - XLTK DEFB 20H,25 ; - BIT 5, 1V REF ; DEFB 17H,28H ;TEST 17- MOS > 1V WITH TUNE ON FREQ DEFB 0,0,10H,0,10 ; - 100 KHZ, DELAY 200 MS DEFW XGTK ; - XGTK DEFB 20H,25 ; - BIT 5, 1V REF ; DEFB 19H,0C8H ;TEST 19- ADJUST 3V < SOS < 7V DEFB 36H,178 ; - MGC, 7V DAC DEFB 34H,10 ; - PORT 96 (SET RATT), DELAY 200 MS DEFW SERVO ; - SERVO DEFB 40H,76,178,50 ; - BIT 6, 3V LOW REF, 7V HIGH, 50 TRIES ; DEFB 20H,0 ;TEST 20- ARFM > 4V AFTER TEST 19 SOS SETUP DEFW XGTK ; - XGTK DEFB 2,102 ; - BIT 1, 4V REF ; DEFB 22H,88H ;TEST 22- ADJUST 3V < AIIS < 7V DEFB 36H,178,10 ; - MGC, 7V DAC, DELAY 200 MS DEFW SERVO ; - SERVO DEFB 80H,76,178,50 ; - BIT 7, 3V LOW REF, 7V HIGH, 50 TRIES ; DEFB 23H,0 ;TEST 23- ARFM > 4V AFTER TEST 22 AIIS SET DEFW XGTK ; - XGTK DEFB 2,102 ; - BIT 1, 4V REF ; DEFB 25H,0D8H ;TEST 25- ARFM > 2V WITH -10 DBM SIG GEN DEFB 16H,255 ; - AGC SHORT, 10V DAC DEFB 30H ; - PORT 96 (ZERO RATT), DUMP AGC DEFB 25 ; - DELAY 500 MS DEFW XGTK ; - XGTK DEFB 2,51 ; - BIT 1, 2V REF ; DEFB 26H,0 ;TEST 26- ARFM < 8V WITH -10 DBM SIG GEN DEFW XLTK ; - XLTK DEFB 2,204 ; - BIT 1, 8V REF ; DEFB 27H,98H ;TEST 27- ARFM > 2V WITH -10 DBM SIG GEN DEFB 18H,255 ; - AGC MEDIUM, 10V DAC, DUMP AGC DEFB 10 ; - DELAY 200 MS DEFW XGTK ; - XGTK DEFB 2,51 ; - BIT 1, 2V REF ; DEFB 28H,0 ;TEST 28- ARFM < 8V WITH -10 DBM SIG GEN DEFW XLTK ; - XLTK DEFB 2,204 ; - BIT 1, 8V REF ; DEFB 29H,98H ;TEST 29- ARFM > 2V WITH -10 DBM SIG GEN DEFB 10H,255 ; - AGC LONG, 10V DAC, DUMP AGC DEFB 10 ; - DELAY 200 MS DEFW XGTK ; - XGTK DEFB 2,51 ; - BIT 1, 2V REF ; DEFB 30H,0 ;TEST 30- ARFM < 8V WITH - 10 DBM SIG GEN DEFW XLTK ; - XLTK DEFB 2,204 ; - BIT 1, 8V REF ; DEFB 31H,0D8H ;TEST 31- ARFM > 4V WITH -50 DBM SIG GEN DEFB 16H,255 ; - AGC SHORT VAR, 10V DAC DEFB 34H ; - PORT 96 (SET RATT), DUMP AGC DEFB 25 ; - DELAY 500 MS DEFW XGTK ; - XGTK DEFB 2,102 ; - BIT 1, 4V REF ; DEFB 33H,58H ;TEST 33- ARFM > 5V WITH SIG GEN OFF DEFB 35H ; - PORT 96 (SET XBIT), DUMP AGC DEFB 25 ; - DELAY 500 MS DEFW XGTK ; - XGTK DEFB 2,128 ; - BIT 1, 5V REF ; DEFB 34H,58H ;TEST 34- DAFM > 1.5V WITH -50 DBM SIG GEN DEFB 34H ; - PORT 96 (ZERO XBIT), DUMP AGC DEFB 100 ; - DELAY 2 SECONDS DEFW XGTK ; - XGTK DEFB 1,38 ; - BIT 0, 1.5V REF ; DEFB 35H,0 ;TEST 35- DAFM < 6.5V WITH -50 DBM SIG GEN DEFW XLTK ; - XLTK DEFB 1,166 ; - BIT 0, 6.5V REF ; DEFB 36H,58H ;TEST 36- DAFM VARIES < .5V FROM TEST 34-35 DEFB 30H ; - PORT 96 (ZERO RATT), DUMP AGC DEFB 100 ; - DELAY 2 SECONDS DEFW DELTA ; - DELTA DEFB 1,12 ; - BIT 0, .5V DELTA REF ; DEFB 38H,0D8H ;TEST 38- DAFM < 2V IN AM (NO MODULATION) DEFB 16H,255 ; - AGC SHORT VAR, 10V DAC DEFB 3CH ; - PORT 96 (SET RATT, SET AM) DEFB 200 ; - DUMP AGC, DELAY 4 SECONDS DEFW XLTK ; - XLTK DEFB 1,51 ; - BIT 0, 2V REF ; DEFB 39H,58H ;TEST 39- DAFM < 2V IN FM (NO MODULATION) DEFB 2CH ; - PORT 96 (SET FM), DUMP AGC DEFB 200 ; - DELAY 4 SECONDS DEFW XLTK ; - XLTK DEFB 1,51 ; - BIT 0, 2V REF ; DEFB 40H,0D8H ;SETUP - TEST 40-44 SET-UP (NO ERRORS) DEFB 16H,255 ; - AGC SHORT, 10V DAC DEFB 34H ; - PORT 96 (SET CW), DUMP AGC DEFB 25 ; - DELAY 500 MS DEFW FILSUP ; - FILSUP (FILTER VERIFICATION SETUP) DEFB 2 ; - BIT 1 ; DEFB 40H,0 ;TEST 40- FILTER 1 VERIFICATION DEFW FILVER ; - FILVER DEFB 2,25,1 ; - BIT 1, 1V DELTA REF, FILTER 1 ; DEFB 41H,0 ;TEST 41- FILTER 2 VERIFICATION DEFW FILVER ; - FILVER DEFB 2,25,2 ; - BIT 1, 1V DELTA REF, FILTER 2 ; DEFB 42H,0 ;TEST 42- FILTER 3 VERIFICATION DEFW FILVER ; - FILVER DEFB 2,25,3 ; - BIT 1, 1V DELTA REF, FILTER 3 ; DEFB 43H,0 ;TEST 43- FILTER 3 VERIFICATION DEFW FILVER ; - FILVER DEFB 2,25,4 ; - BIT 1, 1V DELTA REF, FILTER 4 ; DEFB 44H,0 ;TEST 44- FILTER 5 VERIFICATION DEFW FILVER ; - FILVER DEFB 2,25,5 ; - BIT 1, 1V DELTA REF, FILTER 5 ; DEFB 45H,48H ;TEST 45- IMET < 8V (BASEBAND CONVERTER) DEFB 30H ; - PORT 96 (ZERO RATT, SET CW) DEFB 25 ; - DELAY 500 MS DEFW BSXLTK ; - BSXLTK DEFB 8,204 ; - BIT 3, 8V REF ; DEFB 46H,0 ;TEST 46- IMET > 2V (BASEBAND CONVERTER) DEFW BSXGTK ; - BSXGTK DEFB 8,51 ; - BIT 3, 2V REF ; DEFB 99H,0 ;END OF BITE-- BITDON ADDRESS VECTOR DEFW BITDON ;THIS TABLE IS USED TO SET UP BITE TO A KNOWN INITIAL STATE FOR TESTING ; BSETBL DEFB 5 ;FILTER = 5 DEFB 4 ;AGC = MANUAL DEFB 3 ;DETECT = CW DEFB 44H,0 ;BFOWRK = 440 DEFB 0,0,10H,0 ;FRQWRK = 100K DEFB 0 ;MGCLVL = 0 ;DEFAULT SETUP FOR RECEIVER VARIABLES IF RAM CORRUPTED ; DEFLT DEFB 3 ;FILTER 1 KHZ DEFB 9 ;AGC SHORT (MAIN AND ISB AGC) DEFB 1 ;DETECT AM DEFB 0,1 ;BFOWRK 1 KHZ DEFB 0,0,0,1 ;FRQWRK 1 MHZ DEFB 60 ;MGCLVL 60 DEFB 5 ;MODEWD FREQUENCY DEFB 5 ;MODEWD BACKUP ALSO FREQUENCY DEFB 44H ;TUNCTR LOCKED DEFB 0 ;SYNDAC DEFAULTS FOR 0-.999999 MHZ DEFB 0 ; 1 MHZ DEFB 1 ; 2 MHZ DEFB 1 ; 3 MHZ DEFB 2 ; 4 MHZ DEFB 2 ; 5 MHZ DEFB 3 ; 6 MHZ DEFB 3 ; 7 MHZ DEFB 4 ; 8 MHZ DEFB 4 ; 9 MHZ DEFB 5 ; 10 MHZ DEFB 5 ; 11 MHZ DEFB 6 ; 12 MHZ DEFB 6 ; 13 MHZ DEFB 7 ; 14 MHZ DEFB 7 ; 15 MHZ DEFB 8 ; 16 MHZ DEFB 8 ; 17 MHZ DEFB 9 ; 18 MHZ DEFB 9 ; 19 MHZ DEFB 10 ; 20 MHZ DEFB 10 ; 21 MHZ DEFB 11 ; 22 MHZ DEFB 11 ; 23 MHZ DEFB 12 ; 24 MHZ DEFB 12 ; 25 MHZ DEFB 13 ; 26 MHZ DEFB 13 ; 27 MHZ DEFB 14 ; 28 MHZ DEFB 14 ; 29 MHZ DEFB 15 ; 30 MHZ DEFB 15 ; 31 MHZ - 31.999999 MHZ DEFB 0BCH,0,0 ;FILTAB DEFAULT VALUES -- BYPASS FILTER SLOT DEFB 0,3,24H ; 3.24 KHZ DEFB 0,0,40H ; 400 HZ DEFB 0,1,0 ; 1 KHZ DEFB 0,3,0 ; 3 KHZ DEFB 0,5,0 ; 5 KHZ DEFB 0 ;PORT94 1 MHZ INTERNAL REFERENCE DEFB 0 ;RAMCPT CORRUPTED ORG 8000H ;RAM MEMORY LAYOUT ; FILTER DEFS 1 ;FILTER SLOT STORAGE AGC DEFS 1 ;AGC MODE STORAGE DETECT DEFS 1 ;DETECTION MODE STORAGE BFOWRK DEFS 2 ;BFO FREQUENCY STORAGE FRQWRK DEFS 4 ;FREQUENCY STORAGE MGCLVL DEFS 1 ;MANUAL GAIN LEVEL STORAGE MODEWD DEFS 2 ;MODE AND BACKUP TUNCTR DEFS 1 ;TUNE RATE SYNDAC DEFS 32 ;SYNTHESIZER DAC CONTROL TABLE FILTAB DEFS 18 ;FILTER ID TABLE PORT94 DEFS 1 ;PORT 94 IMAGE RAMCPT DEFS 1 ;RAM INTEGRITY MONITOR RXSTAT DEFS 3 ;RECEIVER STATUS WORDS ADRES DEFS 1 ;RECEIVER ADDRESS IFTRAN DEFS 6 ;IF FILTER RELATIVE WIDTH TRANSFORM TABLE FRQPTR DEFS 1 ;FREQUENCY ENTRY POINTER T25MS DEFS 1 ;25 MS TIMER TIMER DEFS 1 ;BITE TIMER OOLTMR DEFS 1 ;OUT OF LOCK TIMER ENCDRS DEFS 1 ;ENCODER SAMPLE VALUE ENCDRA DEFS 1 ;ENCODER ACCUMULATOR TBLINK DEFS 1 ;BLINK TIMER TSHORT DEFS 1 ;AGC TIMER FOR TEMP SHORT AT DUMP DMPTMR DEFS 1 ;AGC DUMP TIMER KEYCNT DEFS 1 ;KEYSWITCH ROUTINE KEY COUNTER KEYEXC DEFS 1 ;KEYSWITCH ROUTINE POST EXECUTION FLAGS SWSTAT DEFS 2 ;KEYSWITCH PRESS HISTORIES FFSCR DEFS 4 ;FORCE FILTER CONTROL AND FILTER BACK-UP AREA MODCNT DEFS 1 ;MODE REPEAT COUNTER TMPWRK DEFS 20 ;TEMPORARY SCRATCHPAD AREA FRQDSP DEFS 20 ;FREQUENCY ENTRY DISPLAY BUFFER BCDWRK DEFS 4 ;BINARY TO BCD CONVERTER WORK AREA FILSCR DEFS 2 ;SETRCR SCRATCHPAD AREA MONPNT DEFS 2 ;MONITOR MONDAT POINTER MONDAT DEFS 3 ;MONITOR DATA STORAGE DACCTL DEFS 4 ;DAC CONTROL AND STORAGE DACLVL DEFS 1 ;AGC DAC LEVEL DACWRK DEFS 2 ;DAC SCRATCHPAD AREA PORT5 DEFS 1 ;PORT 5 IMAGE PORT92 DEFS 1 ;PORT 92 IMAGE PORT96 DEFS 1 ;PORT 96 IMAGE PORT97 DEFS 1 ;PORT 97 IMAGE PORT9D DEFS 1 ;PORT 9D IMAGE BBUFF DEFS 12 ;BACKUP RECEIVER PARAMETERS STORAGE FOR BITE BITPAR DEFS 2 ;BITE TEST RESULT PARAMETERS BITDAT DEFS 9 ;RAW BITE TEST DATA FOR DISPLAY BITFMT DEFS 16 ;FORMATTED BITE TEST DATA DISPLAY BUFFER NXTTST DEFS 4 ;BITE TEST ADDRESS POINTER AND BACK-UP ERBITE DEFS 6 ;BITE ERRORS AND COUNTER MSVOLT DEFS 1 ;A/D DISPLAY DATA CONTROL SETFCT DEFS 1 ;COUNTER FOR OUTPUT TO SYNTHESIZER INWRK DEFS 6 ;REMOTE INPUT WORK SPACE INFIL DEFS 1 ;REMOTE INPUT FILTER INAGC DEFS 1 ; AGC INDET DEFS 1 ; DETECTOR INBFO DEFS 2 ; BFO INFRQ DEFS 4 ; FREQUENCY INMGC DEFS 1 ; MGC LEVEL TLKREQ DEFS 1 ;REMOTE DATA REQUEST BITS TLKBYT DEFS 1 ;REMOTE RECEIVER PARAMETERS REQUEST BITS COMBYT DEFS 1 ;REMOTE RECEIVER INPUT PARAMETERS FLAG URTCFG DEFS 1 ;UART CONFIGURATION DATA INBUF DEFS 259 ;REMOTE INPUT RING BUFFER OUTBUF DEFS 128 ;REMOTE OUTPUT RING BUFFER ; ;STACKS LOCATED AT TOP OF RAM ; ORG 877FH BITSTK DEFS 1 ;END OF BITE STACK AREA ; ORG 87FFH STACK DEFS 1 ;END OF RECEIVER STACK AREA ; ; END