;*************************************************************************** ; NAME: Donahe, Brendan D. Parks, Jerome C. Copyright (C) 12/4/96 ; COURSE: EE490 Section 4 FINAL PROJECT ;--------------------------------------------------------------------------- ; PURPOSE: To transmit and receive data via APK modulation simultaneously ;--------------------------------------------------------------------------- ; OUTLINE: 1. Initialize pointers and registers ; 2. Negotiation Phase ; 3. Transmission/Reception Phase ;--------------------------------------------------------------------------- ; FILE: MODEM.ASM Main code ; ; SUPPORTING FILES: ; MODEMLIB.INC Subroutines ; MODEM.INC Memory layout/initialization ; ADA_INIT.ASM Supplied code from Motorola ; TXRX_ISR.ASM Supplied code from Motorola ; ; RCVMODEM.C Hostport reception program ; ; ; NOTES: 1. Hostport has been implemented, but only for reception and not ; for transmission. ; 2. ORIGINATE/ANSWER mode and HOSTPORT (enabled/disabled) can be set ; in MODEM.INC. ; 3. For single loop-back board - capable of 4000bps: ; SRATE = 16000 ; FREQ = 4000 ; BAUD = 2000 ; Full-duplex, with or without hostport - capable of 1200bps: ; (default configuration) ; SRATE = 9600 ; FREQ = 2400 ; BAUD = 600 ;--------------------------------------------------------------------------- ; ADDRESS REGISTERS: r0->x:data_bytes r4->y:SINEP ; r1->x:recv_filter r5->y:recv_queue ; r2->x:recv_correlation r6->(Reserved for stack) ; r3-> r7->y:frame_out ;--------------------------------------------------------------------------- ; MEMORY MAP: ; X MEM ;--------------------------- ; $0000 - $001F: (Reserved for Motorola Use) ; $0020 - $00FF: int_delta ; mode ; hostport_mode ; txrx_mode ; negotiation_count ; $0100 - $01FF: (Reserved for mu-law and a-law encoding/decoding tables) ; $0200 - $03FF: (Reserved for program memory overflow) ; $0400 - $FFFF: data_bytes ; recv_filter ; recv_correlation ; temp_correlation_pwr ; ; Y MEM ;--------------------------- ; $0000 - $001F: (Unused) ; $0020 - $00FF: prev_dibit ; temp_dibit ; prev_phase ; frame_counter ; frame_mode ; data_byte ; data_count ; data_dibit ; parity ; dibit_counter ; filter_dibit_count ; startbit_count ; interval_count ; recv_queue ; $0100 - $01FF: (Reserved for sine-table) ; $0200 - $FFFF: extra_zero ; frame_out ;*************************************************************************** START EQU $40 include 'modem.inc' org x: STACK equ * org p:$0 jmp START org p:$000c jsr ssi_rx_isr ; SSI receive data jsr ssi_rx_isr ; SSI receive data with exception jsr ssi_tx_isr ; SSI transmit data jsr ssi_tx_isr ; SSI transmit with exception org p:START movep #$261009,x:PLL ; these labels are defined in the movep #0000,x:BCR ; ada_init.asm program ori #3,mr ; mask interrupts movec #0,sp ; clear hardware stack pointer move #4,omr ; operating mode 4 sine table move #$40,r6 ; initialise stack pointer move #-1,m6 ; linear addressing SINEP equ $100 ; Beginning of wavetable in y move #SINEP,r4 ; point r4 into sine table (y) move #0,n4 move #data_bytes,r0 ; r0 -> beginning of data to tranmit move #>NUM_CHARS-1,x0 move x0,m0 ; modulo queue of characters to send move #recv_filter,r1 ; Receive filter coeficients (x) move #>RECV_BUFSIZ-1,x0 move x0,m1 move #recv_queue,r5 ; Receive current samples (y) move x0,m5 move x0,n5 move #recv_correlation,r2 ; Receive current output correlation move x0,m2 move #0,x0 move #>RECV_BUFSIZ,y0 do y0,end_recv_init move x0,x:(r1)+ ; 0 out recv_filter move x0,y:(r5)+ ; 0 out recv_queue move x0,x:(r2)+ ; 0 out recv_correlation end_recv_init move #>FRAME_OUT_SIZE-1,y0 ; set up circular queue move y0,m7 move #frame_out,r7 ; set up r7 pointer move #>FRAME_OUT_SIZE,y0 ; 0 out frame_out rep y0 move x0,y:(r7)+ jclr #0,x:mode,originate_mode_rx ; check to see if ORIGINATE move #>2,x0 ; or ANSWER move x0,x:txrx_mode clr a move x:negotiation_count,a0 ; if ANSWER mode, need to increment inc a ; negotiation_count by 1 to fill move a0,x:negotiation_count ; filters appropriately originate_mode_rx include 'ada_init.asm' move #>INTERVAL,x0 do x0,end_clear_receive jsr receive_sample move #0,y1 jsr transmit_sample end_clear_receive TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(0*LEFT_ATTN)+(0*RIGHT_ATTN) TONE_INPUT EQU MIC_IN_SELECT+(15*MONITOR_ATTN) ; code for hostport initialization movep #$0000,X:PBC ; set up port-B for parallel out movep #$20FF,X:PBDDR ; PB12(STR)=input, PB13(ACK)=output movep #$2000,X:PBD ; Load Frequency ONCE move #>FUND_PERIOD,x0 ; compute delta for current bit value move #>FREQ,y1 ; load FREQuency into y1 mpyr x0,y1,b ; multiply floating point delta into b move b,x:int_delta ; store int/frac portions of delta ;****************************** main_event_loop ****************************** main_event_loop jsr receive_sample ; always grab a new sample ; which mode are you in? jset #0,x:txrx_mode,negotiation_tx ; 001 -> negotiation_tx jset #1,x:txrx_mode,negotiation_rx ; 010 -> negotiation_rx jset #2,x:txrx_mode,txrx ; 100 -> txrx error jmp error ; loop if there is ever an error ;------------------------- negotiation_tx ----------------------------------- negotiation_tx ; FOR ORIGINATE MODEM ONLY jsr check_pwr ; check to see if ANSWER modem has ; responded: ; x:txrx_mode contains next mode jsr produce_sample ; send out a 00 ; y1 holds output signal jsr transmit_sample ; determine which channel to transmit ; signal on depending if ANSWER ; or ORIGINATE modem, and transmit jmp main_event_loop ; repeat process ;------------------------- negotiation_rx ----------------------------------- negotiation_rx jsr check_pwr ; check to see if other modem has ; responded: ; x:txrx_mode contains next mode move #0,y1 jclr #2,x:txrx_mode,transmit_section ; if next mode is set, then clr a ; data has been transmitted move x:txrx_mode,a ; reset mode so negotiate_filter can asr a ; set it properly move a,x:txrx_mode jsr negotiate_filter ; fills filter bank from samples sent ; by other modem ; x:txrx_mode contains next mode jsr produce_sample ; send out a 00 ; y1 holds output signal transmit_section jsr transmit_sample ; determine which channel to transmit ; signal on depending if ANSWER ; or ORIGINATE modem, and transmit jmp main_event_loop ; repeat process ;-------------------------------- txrx --------------------------------------- txrx jsr filter_bits ; multiples and sums filter coef by ; sampled values ; a holds signed magnitude jsr decode_decision ; takes in signed power magnitude to ; determine what the dibit should be ; y1 holds decoded dibit: 0, 1, 2 or 3 jsr resync_filter ; if 00 dibit, reconstruct filter coefs ; y1 enters and exits with dibit jsr frame_decoder ; wait for start bits, then decode ; data, parity, and stop bits, and ; put them in memory ; y:frame_out, y:(r7), holds data jsr frame_encoder ; creates a dibit out of current values ; in memory ; x0 holds dibit: 0, 1, 2, or 3 jsr encode_dibit ; take in dibit and make ready for ; transmission ; y1 holds output signal jsr transmit_sample ; determine which channel to transmit ; signal on depending if ANSWER ; or ORIGINATE modem, and transmit ; what entered in y1 jclr #0,x:hostport_mode,no_hostport_connection ; see if using the hostport or not jsr output_hostport ; handshakes with and transmit data ; to host computer no_hostport_connection jmp main_event_loop ;**************************** end main_event_loop **************************** include 'modemlib.inc' ; contains all the main_event_loop ; subroutines include 'txrx_isr.asm' end