FrameInfoSeg MACRO ;******************************************************************************** ; FRAMING LAYER ;******************************************************************************** ; ; Receive : Processes incomming characters and passes payload to payload layer ; Transmit : Frames and applies transparency to payload data ; ;******************************************************************************** ; ; Normal Frame Format: Allowable: Send: ; n * FF n >= 0 n = 10 ; n * BOF n >= 1 n = 1 ; n * Payload data ; 2 * FCS ; 1 * EOF ; ; FCS - Frame Check Sequence ; 16 bit CCITT CRC sent low byte first ; Transmit : send the complement of the calculated FCS ; Receive : include FCS bytes in calculation of the FCS, FCS will equal $f0b8 if valid ; Note : FCS covers the payload data only. ; It is calculated prior to adding any transparency bytes (ie FCS bytes must also be transparent). ; ; Transparency: ; CE(=$7D) indicates transparency issue ; CE EOF incicates sender has terminated packet ; CE BOF indicates sender has restarted payload ; CE * anything else: XOR with $20 to recover origional data ; ;******************************************************************************** ; ;Asynchronous Events ; ; a2flRxAvail() ;Signal to indicate that a byte has been received ; a2flTxEmpty() ;Signal to indicate that the last byte has finished transmitting ; ;Interface ; ; fl2plRxData(w=Data) ;Data byte from frame ; fl2plRxValid() ;Payload data is complete and valid ; fl2plRxError() ;Payload data contains errors ; pl2flRxIgnore() call ;Return to idle state thus terminating any frame being received ; ; pl2flTxStart() ;Request from payload layer to send a frame - Does not test for media busy ; fl2plTxData(ret w=Data ret z=Last) call ;Request data from payload layer - Z flag is set if its the last byte ; fl2plTxComplete() ;Inform payload layer that the transmission is complete ; ;Notes ; - The Rx code does not time out but is reset by calling RxIgnore, by receiving a new frame, or by transmitting a frame ; - If a frame is transmitted (TxStart) while a frame is being recieved the RxCode will reset to the idle state ; without indicating an error (RxError). ; ;******************************************************************************** ENDM FrameDataSeg MACRO ;******************************************************************************** ; FRAMING LAYER ;******************************************************************************** org $38 flBank = $38 ;8 bytes used - Note bank shared with Uart flState ds 1 ;flBank - current state flData ds 1 ;flBank - storage for a byte received flPosition ds 1 ;flBank - Counter used to count the FF codes at start of frame and to keep track of buffer flBuffer ds 2 ;flBank - 2 byte buffer to delay the passing of payload data to allow the removal of the FCS flFFCount ds 1 ;flBank - number of FFs to send at the start of each packet flFCSl ds 1 ;flBank - 16-bit FCS value (low byte) flFCSh ds 1 ;flBank - 16-bit FCS value (high byte) flRxState = %00000000 flTxState = %10000000 flRxBeginState = 1 + flRxState ;waiting for start of payload flRxPayloadState = 2 + flRxState ;receiving payload data flRxCtrlState = 3 + flRxState ;waiting for byte after CE code flTxBeginState = 1 + flTxState ;sending initial FF bytes flTxCtrlState = 2 + flTxState ;waiting to send an encoded payload data byte flTxPayloadState = 3 + flTxState ;waiting to send another payload byte flTxFCSlState = 4 + flTxState ;waiting to send FCSl flTxFCShState = 5 + flTxState ;waiting to send FCSh flTxSendEndState = 6 + flTxState ;waiting to send EOF to close frame flTxWaitEndState = 7 + flTxState ;waiting for EOF to finish begin sent BOF = $C0 ; = %11000000 ;Beginning of Frame code (refer IrLAP specification) EOF = $C1 ; = %11000001 ;End of Frame code (refer IrLAP specification) CE = $7D ; = %01111101 ;Control Escape code (refer IrLAP specification) ValidFCSh = $F0 ValidFCSl = $B8 ;******************************************************************************** ENDM FrameCodeSeg MACRO ;******************************************************************************** ; FRAMING LAYER ;******************************************************************************** ;********** a2flReset ********** a2flReset bank IsrBank mov IrdaSpeed, #Irda9600 ;IrDA UART speed = 9600 bank flBank clr flState ;Reset to idle state mov flFFCount, #10 ;Default to 10 FFs @ 9600 = 10.42ms retp ;********** a2flRxAvail ********** a2flRxAvail ;The IrdaRxAvail flag was set bank IsrBank mov w, IrdaData ;Get received byte clrb IrdaRxAvail ;Clear flag bank flBank snb flState.7 ;Current state = receiving or idle ? retp ;No => ignore (do not need to inform lap layer of media busy as in transmit mode) mov flData, w ;Store byte that was received debug PhysicalDataRx ;Debug: pass data received call @fl2lapMediaBusy ;Inform lap layer of media busy bank flBank mov w, flState ;Jump based on state jmp PC+w jmp flRxIdle ; 0 = Idle jmp flRxBegin ; 1 = flRxBeginState jmp flRxPayload ; 2 = flRxPayloadState jmp flRxCtrl ; 3 = flRxCtrlState ;********** a2flTxEmpty ********** a2flTxEmpty ;From physical layer: Last byte has finished transmitting bank IsrBank clrb IrdaTxEmpty ;Clear flag bank flBank sb flState.7 ;Check that it is a TxState retp ;Rx state or idle => return mov w, flState ;Jump based on state and w, #%01111111 ;Remove Tx state flag jmp PC+w retp ; 0 = Invalid state jmp flTxBegin ; 1 = flTxBeginState jmp flTxCtrl ; 2 = flTxCtrlState jmp flTxPayload ; 3 = flTxPayloadState jmp flTxFCSl ; 4 = flTxFCSlState jmp flTxFCSh ; 5 = flTxFCShState jmp flTxSendEnd ; 6 = flTxSendEndState jmp flTxWaitEnd ; 7 = flTxWaitEndState ;********** pl2flRxIgnore ********** pl2flRxIgnore bank flBank clr flState ;Reset to idle state retp ;******************************************************************************** ; FRAMING LAYER - FCS Subroutines ;******************************************************************************** ;********** FCS Subroutines ********** flFCSa = Temp ;Global - Tempory varable used in the FCS calculation flFCSInit mov w, #$ff ;Init FCS to $FFFF mov flFCSh, w ;Init FCS to $FFFF mov flFCSl, w ;Init FCS to $FFFF retp flFCSData ;Add data to FCS (w = Data) (must be in flBank) xor flFCSl, w ;FCSl[=X] = FCSl xor w mov w,<>flFCSl ;w = FCSl[32107654] and w,#%11110000 ;w = FCSl[3210oooo] xor flFCSl, w ;FCSl = FCSl xor (FCSl shl 4) ;Calculate A = FCSh mov w, <>flFCSl ;w = FCSl[32107654] mov flFCSa, w ;A = FCSl[32107654] mov w, >>flFCSa ;w = FCSl[x3210765] and w, #%00000111 ;w = FCSl[ooooo765] xor w, flFCSl ;w = FCSl xor (FCSl shr 5) mov flFCSa, w ;store w into A = new FCSh value ;Calculate new FCSl value rl flFCSl ; rl flFCSl ; mov w, <<flFCSl ;w = FCSl[43210xxx] and w, #%11111000 ;w = FCSl[43210ooo] xor w, flFCSh ;w = (FCSl shl 3) xor FCSh mov flFCSl, w ;Store w into FCSl mov w, <>flFCSa ;w = A[32107654] and w, #%00001111 ;w = A[oooo7654] xor flFCSl, w ;FCSl = (FCSl shl 3) xor FCSh xor (A shr 4) ;Store new FCSh value mov w, flFCSa ;A holds FCSh value mov flFCSh, w ;Store A in FCSh retp ;******************************************************************************** ; FRAMING LAYER - Receive ;******************************************************************************** flRxPassData ;Adds data (flRxData) to FCS and passes data to payload layer mov w, flData ;Last byte that was received call flFCSData ;Add Data to FCS value mov Temp, flBuffer+1 ;Shift data out of buffer mov flBuffer+1, flBuffer+0 ;Shift data in buffer mov flBuffer+0, flData ;Shift new data into buffer incsz flPosition ;Inc position, Zero ? retp ;No => buffer is not full, return dec flPosition ;Set position to FF to indicate buffer is still full mov w, Temp ;Data to pass jmp @fl2plRxData ;pass data to payload layer (payload layer issues retp instruction) ;********** a2flRxAvail - Idle State ********** flRxIdle ;Waiting for a BOF to indicate start of frame csne flData, #BOF ;Was byte a BOF ? inc flState ;Yes => BOF received indicating start of frame => change to flRxBeginState retp ;********** a2flRxAvail - Begin State ********** flRxBegin ;Waiting for non BOF to indicate start of data csne flData, #BOF ;Was byte a BOF ? retp ;Yes => ignore csne flData, #EOF ;Was byte a EOF indicating sender has terminated frame ? jmp :Idle ;Yes => return to idle state csne flData, #CE ;Was byte a CE indicating a transparency issue ? jmp :Ctrl ;Yes => change to Ctrl state mov flState, #flRxPayloadState ;Must be data => Payload state call flFCSInit ;Init FCS mov flPosition, #-3 ;Init buffer position jmp flRxPassData ;pass data to payload layer (payload layer issues ret instruction) :Idle clr flState ;EOF indicating sender has terminated frame => return to idle state retp :Ctrl mov flState, #flRxCtrlState ;CE indicating transparency issue => change to Ctrl state retp ;********** a2flRxAvail - Payload State ********** flRxPayload ;Currently receiving payload csne flData, #BOF ;Was byte a BOF indicating sender has terminated the payload and started again ? jmp :Begin ;Yes => terminate payload and goto Begin state csne flData, #EOF ;Was byte an EOF indicating the frame/payload is complete ? jmp :Idle ;Yes => signal complete payload and retpurn to idle state csne flData, #CE ;Was byte a CE indicating a transparency issue ? jmp :Ctrl ;Yes => change to Ctrl state jmp flRxPassData ;pass data to payload layer (payload layer issues retp instruction) :Begin mov flState, #flRxBeginState ;premature BOF => indicate payload reset to payload layer and retpurn to RxBegin State jmp @fl2plRxError ;indicate error to payload layer (payload layer issues retp instruction) :Idle clr flState ;EOF => end of frame reached => inform payload layer and retpurn to idle state cse flFCSh, #ValidFCSh ;valid FCS (high) ? jmp @fl2plRxError ;No => indicate reset to payload layer (payload layer issues retp instruction) cse flFCSl, #ValidFCSl ;valid FCS (low) ? jmp @fl2plRxError ;No => indicate reset to payload layer (payload layer issues retp instruction) jmp @fl2plRxValid ;FCS valid => indicate complete to payload layer (payload layer issues retp instruction) :Ctrl mov flState, #flRxCtrlState retp ;********** a2flRxAvail - Ctrl State ********** flRxCtrl ;CE has been encountered, need to check next character csne flData, #BOF ;Was byte BOF indicating sender has terminated payload and started again ? jmp :Begin ;Yes => restart at Begin state (Note payload layer has been passed data => must inform payload layer of reset) csne flData, #EOF ;Was byte EOF indicating sender has terminated frame ? jmp :Idle ;Yes => retpurn to idle (Note: payload layer has been passed any data => must inform payload layer of reset) mov flState, #flRxPayloadState ;Must be data => pass data to payload layer and retpurn to payload state xor flData, #$20 ;Recover data jmp flRxPassData ;pass data to payload layer (payload layer issues retp instruction) :Begin mov flState, #flRxBeginState ;BOF => sender has terminated payload and started again => retpurn to begin state jmp @fl2plRxError ;indicate error to payload layer (payload layer issues retp instruction) :Idle clr flState ;EOF => sender has terminated frame => retpurn to idle state jmp @fl2plRxError ;indicate error to payload layer (payload layer issues retp instruction) ;******************************************************************************** ; FRAMING LAYER - Transmit ;******************************************************************************** flTxSendData ;Send byte (w) now (doesn't check for busy) bank IsrBank mov IrdaData, w ;Byte to send setb IrdaTxStart ;Send byte debug PhysicalDataTx ;Debug: pass data being transmitted retp ;WARNING - not in flBank ;********** pl2flTxFrame ********** pl2flTxFrame ;Request to start a new frame bank flBank mov flState, #flTxBeginState ;Next state = begin mov flPosition, flFFCount ;Counter = FFCount mov w, #$FF jmp flTxSendData ;Send FF (flTxSendData issues ret instruction) ;********** a2flTxEmpty - Begin State ********** flTxBegin ;Sending prefex FF bytes dec flPosition ;Decrement counter snz ;Zero ? jmp :BOF ;Yes => send BOF and set next state to send payload data mov w, #$FF ;No => Send another FF jmp flTxSendData ;(TxSendData issues ret instruction) :BOF mov flState, #flTxPayloadState ;Will enter flTxPayload state after BOF has been sent call flFCSInit ;Init FCS mov w, #BOF ;Send BOF jmp flTxSendData ;********** a2flTxEmpty - Send States ********** flTxPayload call @fl2plTxData ;Get data from payload layer bank flBank snz ;Is this the last byte ? (Z set) inc flState ;Yes => Next State = FCSl mov flData, w ;Store data debug PayloadDataTx ;Debug: pass payload data being transmitted call flFCSData ;w = flData - Add data to FCS jmp flTxSend ;Check for control code and send flTxFCSl mov w, /flFCSl ;Next data to send = FCSl mov flData, w ;Store in TxData inc flState ;Next State = FCSh jmp flTxSend ;Check for control code and send flTxFCSh mov w, /flFCSh ;Next data to send = FCSh mov flData, w ;Store in TxData inc flState ;Next State = End jmp flTxSend ;Check for control code and send flTxSend ;Send payload byte csne flData, #BOF ;Is byte a control code ? jmp :Ctrl ;Yes => transparency issue csne flData, #EOF ;Is byte a control code ? jmp :Ctrl ;Yes => transparency issue csne flData, #CE ;Is byte a control code ? jmp :Ctrl ;Yes => transparency issue mov w, flData ;Yes => transmit data jmp flTxSendData ;Send byte :Ctrl mov flPosition, flState ;Store current state in position variable mov flState, #flTxCtrlState ;Next state = TxCtrlState mov w, #CE jmp flTxSendData ;Send CE code (TxSendData issues ret instruction) flTxCtrl mov flState, flPosition ;Recover old state from position variable mov w, flData xor w, #$20 ;Encode data jmp flTxSendData ;********** a2flTxEmpty - SendEnd State ********** flTxSendEnd ;FCS finished => send EOF to close frame inc flState ;Next state = flTxWaitEnd state mov w, #EOF jmp flTxSendData ;Send EOF (TxSendData issues ret instruction) ;********** a2flTxEmpty - WaitEnd State ********** flTxWaitEnd ;Frame finished and now last byte has finished sending clr flState ;Return to idle state jmp @fl2plTxComplete ;Inform payload layer that the transmission is complete (payload layer issues retp instruction) ;******************************************************************************** ENDM
file: /Techref/scenix/lib/io/osi2/ir/da/FRAME.SRC, 15KB, , updated: 1999/8/20 19:43, local time: 2024/8/14 14:13,
18.226.181.54:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://sxlist.com/techref/scenix/lib/io/osi2/ir/da/FRAME.SRC"> scenix lib io osi2 ir da FRAME</A> |
Did you find what you needed? |
Welcome to sxlist.com!sales, advertizing, & kind contributors just like you! Please don't rip/copy (here's why Copies of the site on CD are available at minimal cost. |
Welcome to sxlist.com! |
.