PayloadInfoSeg MACRO ;******************************************************************************** ; PAYLOAD LAYER ;******************************************************************************** ; ;Framing Layer Events ; ; fl2plRxData(w=Data) ;Data byte from frame ; fl2plRxValid() ;Payload data is complete and valid ; fl2plRxError() ;Payload data contains errors ; pl2flRxIgnore() call ;Tell framing layer to ignore the current frame ; ; pl2flTxStart() ;Request framing layer to start a frame ; fl2plTxData(var w=Data var z=Last) call ;Request for data from framing layer - Z flag is set if its the last byte ; fl2plTxComplete() ;Transmission is complete ; ;LAP Layer Events ; ; pl2lapRxFrame(w=Type) ;Incomming frame of given type ; pl2lapRxValid() ;Frame was valid ; pl2lapRxError() ;Frame was invalid ; pl2lapRxXIDData(w=Data) ;Pass XID data to lap layer ; pl2lapRxIData(w=Data) ;Pass I data to lap layer ; pl2lapRxUIData(w=Data) ;Pass I data to lap layer ; lap2plRxIgnore() ;LAP layer has requested that the frame should be ignored ; ; lap2plSNRMAccept() ;Accept connection and send reply ; lap2plTxXIDCmd(w=Slot) ;Send a XID command frame ; lap2plTxXIDRsp() ;Send a XID response frame ; lap2plTxSimpleRsp(w=Command) ;Send simple response frame ; lap2plTxIRsp(w=Command) ;Send an I frame ; pl2lapTxIData(ret w=Data ret z=Last) call ;Request for data ; pl2lapTxComplete() ;Complete indication ; ; lap2plGenerateNewAddr ;Request that a new 32-bit address be generated ; ;******************************************************************************** ENDM PayloadDataSeg MACRO ;******************************************************************************** ; PAYLOAD LAYER ;******************************************************************************** org $50 plBank = $50 ;16 bytes used - Bank not shared plState ds 1 ;Current state plData ds 1 ;Incomming byte of payload data plFrameType ds 1 ;The frame type for shared code / passed to lap layer plCommand ds 1 plPosition ds 1 ;Current position for multibyte states plConnAddr ds 1 ;Connection address (must be FF if not connected) plSelfAddr ds 4 ;Own 4 byte address plDestAddr ds 4 ;Dest 4 byte address plInfo ds 2 ;Frame specific information plTxAddressByte = plData ;Address to be transmitted plTxPostCommand = plPosition plIDataDLSAP = plInfo+0 ;DLSAP byte from/for a I Data frame plIDataSLSAP = plInfo+1 ;SLSAP byte from/for a I Data frame plXIDSlot = plInfo+0 ;Slot number from/for a XID frame plXIDFlags = plInfo+1 ;Discovery Flags from/for a XID frame plSNRMConnAddr = plInfo+0 ;Connection Address of SNRM frame plSNRMBaudRate = plInfo+1 ;Baudrate parameter from SNRM frame iFrame = 1 sRRFrame = 2 sRNRFrame = 3 sREJFrame = 4 sSREJFrame = 5 uUIFrame = 6 ;UICmd or UIRsp (same command) uDISCFrame = 7 ;DISCCmd or RDRsp (same command) uUARspFrame = 8 ;UARsp uNRMFrame = 9 ;SNRMCmd or RNRMRsp (same command) uTESTFrame = 10 ;TESTCmd or TESTRsp (same command) uFRMRRspFrame = 11 ;FRMRRsp uDMRspFrame = 12 ;DMRsp uXIDCmdFrame = 13 ;XIDCmd uXIDRspFrame = 14 ;XIDRsp sRR = %00010001 ;%xxx10001 sRNR = %00010101 ;%xxx10101 sREJ = %00011001 ;%xxx11001 sSREJ = %00011101 ;%xxx11101 uSNRMCmd = %10010011 uDISCCmd = %01010011 uUICmd = %00010011 uXIDCmd = %00111111 uTESTCmd = %11110011 uRNRMRsp = %10010011 uUARsp = %01110011 uFRMRRsp = %10010111 uDMRsp = %00011111 uRDRsp = %01010011 uUIRsp = %00010011 uXIDRsp = %10111111 uTESTRsp = %11110011 plRxState = %00000000 plTxState = %10000000 plRxCommandState = 1 + plRxState ; plRxDataIgnoreState = 2 + plRxState plRxIDataState = 3 + plRxState ;RxI plRxUIDataState = 4 + plRxState ;RxUI plRxXIDFormatState = 5 + plRxState ;RxXID plRxXIDSourceState = 6 + plRxState ;RxXID plRxXIDDestState = 7 + plRxState ;RxXID plRxXIDFlagsState = 8 + plRxState ;RxXID plRxXIDSlotState = 9 + plRxState ;RxXID plRxXIDVersionState = 10 + plRxState ;RxXID plRxXIDInfoState = 11 + plRxState ;RxXID plRxSNRMSourceState = 12 + plRxState ;RxSNRM plRxSNRMDestState = 13 + plRxState ;RxSNRM plRxSNRMAddrState = 14 + plRxState ;RxSNRM plRxSNRMParamTypeState = 15 + plRxState ;RxSNRM plRxSNRMParamSizeState = 16 + plRxState ;RxSNRM plRxSNRMParamDataState = 17 + plRxState ;RxSNRM plTxCompleteState = 1 + plTxState ;Waiting for Complete indication from framing Layer plTxAddressState = 2 + plTxState ; plTxCommandState = 3 + plTxState ; plTxIDataDLSAPState = 4 + plTxState ; plTxIDataSLSAPState = 5 + plTxState ; plTxIDataDataState = 6 + plTxState ; plTxUIDataState = 7 + plTxState ; plTxXIDFormatState = 8 + plTxState ; plTxXIDSourceState = 9 + plTxState ; plTxXIDDestState = 10 + plTxState ; plTxXIDFlagsState = 11 + plTxState ; plTxXIDSlotState = 12 + plTxState ; plTxXIDVersionState = 13 + plTxState ; plTxXIDFooterState = 14 + plTxState ; plTxUASourceState = 15 + plTxState ; plTxUADestState = 16 + plTxState ; plTxUABaudRateState = 17 + plTxState ; plTxUAParamState = 18 + plTxState ; ;******************************************************************************** ENDM PayloadCodeSeg MACRO ;******************************************************************************** ; PAYLOAD LAYER ;******************************************************************************** ;********** a2plReset ********** a2plReset bank plBank clr plState ;Reset to idle state mov plConnAddr,#$FF ;Not connected => address must be $FF retp ;********** fl2plRxData ********** fl2plRxData bank plBank snb plState.7 ;Check that it is a RxState retp ;Tx state => return mov plData, w ;Store incomming byte debug PayloadDataRx ;Debug: Pass payload byte received mov w, plState ;Jump based on state jmp PC+w jmp plRxIdle ; 0 = plIdleState jmp plRxCommand ; 1 = plRxCommandState retp ; 2 = plRxDataIgnoreState jmp plRxIData ; 3 = plRxIDataState jmp plRxUIData ; 4 = plRxUIDataState jmp plRxXIDFormat ; 5 = plRxXIDFormatState jmp plRxXIDSource ; 6 = plRxXIDSourceState jmp plRxXIDDest ; 7 = plRxXIDDestState jmp plRxXIDFlags ; 8 = plRxXIDFlagsState jmp plRxXIDSlot ; 9 = plRxXIDSlotState jmp plRxXIDVersion ;10 = plRxXIDVersionState jmp plRxXIDInfo ;11 = plRxXIDInfoState jmp plRxSNRMSource ;12 = plRxSNRMSourceState jmp plRxSNRMDest ;13 = plRxSNRMDestState jmp plRxSNRMAddr ;14 = plRxSNRMAddrState jmp plRxSNRMParamType ;15 = plRxSNRMParamTypeState jmp plRxSNRMParamSize ;16 = plRxSNRMParamSizeState jmp plRxSNRMParamData ;17 = plRxSNRMParamDataState ;********** fl2plTxData ********** fl2plTxData bank plBank sb plState.7 ;Check that it is a TxState retp ;Rx state => return mov w, plState ;Jump based on state and w, #%01111111 ;Remove Tx state flag jmp PC+w retp ; 0 = Invalid state retp ; 1 = plTxCompleteState (Cannot receive TxData in this state) jmp plTxAddress ; 2 = plTxAddressState jmp plTxCommand ; 3 = plTxCommandState jmp plTxIDataDLSAP ; 4 = plTxIDataDLSAPState jmp plTxIDataSLSAP ; 5 = plTxIDataSLSAPState jmp plTxIDataData ; 6 = plTxIDataDataState jmp plTxUIData ; 7 = plTxUIDataState jmp plTxXIDFormat ; 8 = plTxXIDFormatState jmp plTxXIDSource ; 9 = plTxXIDSourceState jmp plTxXIDDest ;10 = plTxXIDDestState jmp plTxXIDFlags ;11 = plTxXIDFlagsState jmp plTxXIDSlot ;12 = plTxXIDSlotState jmp plTxXIDVersion ;13 = plTxXIDVersionState jmp plTxXIDFooter ;14 = plTxXIDFooterState jmp plTxUASource ;15 = plTxUASourceState jmp plTxUADest ;16 = plTxUADestState jmp plTxUABaudRate ;17 = plTxUABaudRateState jmp plTxUAParam ;18 = plTxUAParamState ;********** fl2plTxComplete ********** fl2plTxComplete bank plBank clr plState ;return to idle state debugl PayloadDataTx, '^' ;Debug: Payload data complete indication jmp @pl2lapTxComplete ;Indicate complete to lap layer (pl2lapTxComplete will issue ret instrustion) ;********** lap2plTxUICmd ********** lap2plTxUICmd jmp plTxUICmd ;******************************************************************************** ; PAYLOAD LAYER - Internal Subroutines ;******************************************************************************** plRxDecodeSCmd ;WARNING - does not set pa bits when ret => must be callled form same half page mov Temp, w ;Command: check bits %....nn.. rr Temp ;Shift command right 1 mov w, >>Temp ;Shift command right 1 and into w and w, #%00000011 ;Mask out unwanted bits jmp PC+w ;jump based on w retw sRRFrame ;....00.. = RR retw sRNRFrame ;....01.. = RNR retw sREJFrame ;....10.. = REJ retw sSREJFrame ;....11.. = SREJ plRxDecodeUNextState ;WARNING - does not set pa bits when ret => must be callled form same half page mov Temp, w ;FrameType mov w, #uUIFrame ;lowest FrameType constant for a U frame sub Temp, w ;subtract lowest valid number so uUIFrame is now 0 mov w, Temp jmp PC+w retw plRxUIDataState ;uUIFrame = 6 ;UICmd or UIRsp (same command) retw plRxDataIgnoreState ;uDISCFrame = 7 ;DISCCmd or RDRsp (same command) retw plRxDataIgnoreState ;uUARspFrame = 8 ;UARsp retw plRxSNRMSourceState ;uNRMFrame = 9 ;SNRMCmd or RNRMRsp (same command) retw plRxDataIgnoreState ;uTESTFrame = 10 ;TESTCmd or TESTRsp (same command) retw plRxDataIgnoreState ;uFRMRRspFrame = 11 ;FRMRRsp retw plRxDataIgnoreState ;uDMRspFrame = 12 ;DMRsp retw plRxXIDFormatState ;uXIDCmdFrame = 13 ;XIDCmd retw plRxXIDFormatState ;uXIDRspFrame = 14 ;XIDRsp lap2plGenerateNewAddr ;Note: code is synchronous with the ISR therfore RTCC and Timer registers are not random numbers bank TimerBank mov w, Random ;Random number bank plBank mov plSelfAddr+0, w ;Byte 0 = Random number mov FSR, w mov w, INDF bank plBank mov plSelfAddr+1, w ;Byte 1 = contents of the register pointer to by the Random number mov m, w ;m = byte 1 number (semi random) mov w, plSelfAddr+0 ;w = byte 0 number (fully random) iread ;read ROM and address given by w and m mov plSelfAddr+2, w ;Byte 2 = low contents of ROM pointed to by byte1:byte0 mov w, m ;w = m = high 4 bits of ROM contents mov plSelfAddr+3, w ;Byte 3 = high contents of ROM pointed to by byte1:byte0 retp ;******************************************************************************** ; PAYLOAD LAYER - Receive ;******************************************************************************** ;********** fl2plRxValid ********** fl2plRxValid clrb ledERR ;Turn ERR led off debugl PayloadDataRx, '^' ;Debug: Indicate complete bank plBank clr plState ;Return to idle state jmp @pl2lapRxValid ;Inform lap layer that frame was valid (lap layer will issue ret instruction) ;********** fl2plRxError ********** fl2plRxError setb ledERR ;Turn ERR led on debugl PayloadDataRx, '!' ;Debug: Indicate error bank plBank clr plState ;Return to idle state jmp @pl2lapRxError ;Inform lap layer that frame was invalid (lap layer will issue ret instruction) ;********** lap2plRxIgnore ********** lap2plRxIgnore ;Ignore the current incomming frame bank plBank plRxIgnore clr plState ;Return to idle state jmp @pl2flRxIgnore plRxInvalid clr plState ;Return to idle state call @pl2flRxIgnore jmp @pl2lapRxError ;Inform lap layer of error ;******************************************************************************** ; PAYLOAD LAYER - RxData General ;******************************************************************************** plRxStoreSource mov w, #plDestAddr ;pointer to DestAddress variable add w, plPosition ;add offset mov FSR, w ;Now can indirectly access mov INDF, plData ;Store byte into SourceAddr inc plPosition ;Move offset ready for next byte of SourceAddr cse plPosition, #4 ;Have 4 bytes been received ? retp ;No => remain in this state waiting for next byte inc plState ;Yes => end of Source. Change to next state clr plPosition retp plRxTestDest ;WARNING : will pass FF bytes in specific address (ie bytewise checking, not FFFFFFFF checking) csne plData, #$FF ;Broadcast address ? jmp :Cont ;Yes => Contiue mov w, #plSelfAddr ;pointer to SelfAddress variable add w, plPosition ;add offset mov FSR, w ;Now can indirectly access cse plData, INDF ;Self Address ? jmp plRxInvalid ;No => Ignore frame, Inform lap layer of error, and return to idle :Cont inc plPosition ;Move offset ready for next byte of DestAddr cse plPosition, #4 ;Have 4 bytes been received ? retp ;No => remain in this state waiting for next byte inc plState ;Yes => end of DestAddr. Change to next state clr plPosition retp ;******************************************************************************** ; PAYLOAD LAYER - RxData ;******************************************************************************** ;********** fl2plRxData - Idle State ********** plRxIdle ;First byte = address mov w, plData ;Received Address xor w, plConnAddr ;Compare with interested address sz ;Valid address ? jmp plRxIgnore ;No => ignore mov plState, #plRxCommandState ;Yes => next will receive command byte retp ;********** fl2plRxData - RxCommand State ********** plRxCommand mov plCommand, plData ;Store command sb plCommand.4 ;Is the P/F bit set ? jmp plRxIgnore ;No => Ignore frame (IrDA lite spec p10 and p16) and return to idle state sb plCommand.0 ;Is this an I frame ? (%.......0) jmp plRxICommand ;Yes => process sb plCommand.1 ;No => must be S or U frame. Is this a S frame ? jmp plRxSCommand ;Yes (%......01) => process S frame jmp plRxUCommand ;No (%......11) => process U frame plRxICommand debugl PayloadInfo, 'I' mov plState, #plRxIDataState ;Next should be data mov plFrameType, #iFrame ;store frame type and w will also be passed to lap layer jmp @pl2lapRxFrame ;pass message (lap layer will issue ret instruction) plRxSCommand debugl PayloadInfo, 'S' mov plState, #plRxDataIgnoreState ;Next should be complete indication (ie no data) but need waiting state mov w, plCommand call plRxDecodeSCmd ;pass w = plRxData, returns w for plFrameType mov plFrameType, w ;store frame type and w will also be passed to lap layer jmp @pl2lapRxFrame ;pass message (lap layer will issue ret instruction) plRxUCommand debugl PayloadInfo, 'U' mov plPosition, #_plUCommands ;plPosition = 1st byte of data :Loop mov m, #_plUCommands / 256 ;m = Pointer to string (high) mov w, plPosition ;w = Pointer to string (low) inc plPosition ;Increment offset for next byte iread ;Read data byte from ROM xor w, plCommand ;is the byte the same as the received command ? jz :Found ;Yes => must be valid mov w, m ;No => try again. Move high part of data to w test w ;Is this the last byte ? jz :Loop ;No => try again jmp plRxIgnore ;Yes => Invalid command => ignore and return to idle state :Found mov plFrameType, plPosition ;plFrameType = position mov w, #_plUCommands + 1 ;w = starting offset sub plFrameType, w ;remove offset => FrameType 0 for a uUIFrame mov w, #uUIFrame ;constant of first type of U command (uUIFrame = 6) add plFrameType, w ;FrameType is now correct mov w, plFrameType ;pass FrameType in w call plRxDecodeUNextState ;Returns w = next state mov plState, w ;Store state clr plPosition ;Clear position for following states mov w, plFrameType ;pass frame type to lap layer jmp @pl2lapRxFrame ;pass message (lap layer will issue ret instruction) ;******************************************************************************** ; PAYLOAD LAYER - Receiving I Frame ;******************************************************************************** ;********** fl2plRxData - RxIData State ********** plRxIData mov w, plData ;Data to pass debug IFrameDataRx ;Show debug info jmp @pl2lapRxIData ;Pass data to lmp layer (via lap layer) ;******************************************************************************** ; PAYLOAD LAYER - Receiving UI Frame ;******************************************************************************** ;********** fl2plRxData - RxUIData State ********** plRxUIData mov w, plData ;Data to pass jmp @pl2lapRxUIData ;Pass data to app layer (via lap layer) ;******************************************************************************** ; PAYLOAD LAYER - Receiving XID Frame ;******************************************************************************** ;********** fl2plRxData - RxXIDFormat State ********** plRxXIDFormat cse plData, #1 ;Format must be 1 jmp plRxInvalid ;No => Ignore frame, inform lap layer, and return to idle state inc plState ;Next 4 bytes will be the source address => Enter plRxXIDSourceState clr plPosition ;Byte 0 of the source address retp ;********** fl2plRxData - RxXIDSource State ********** plRxXIDSource = plRxStoreSource ;Store byte in DestAddr ;********** fl2plRxData - RxXIDDest State ********** plRxXIDDest = plRxTestDest ;Compare 4 bytes with SelfAddr (mismatch of not FFFFFFFF will change to ignore state) ;********** fl2plRxData - RxXIDFlags State ********** plRxXIDFlags mov plXIDFlags, plData ;Store the flags for the response inc plState ;Next will receive the slot number (plRxXIDSlotState) retp ;********** fl2plRxData - RxXIDSlot State ********** plRxXIDSlot mov plXIDSlot, plData ;Store the slot number inc plState ;plRxXIDVersionState retp ;********** fl2plRxData - RxXIDVersion State ********** plRxXIDVersion test plData ;Is version = 0 ? jnz plRxInvalid ;No => Ignore frame, inform lap layer, and return to idle state inc plState ;Next bytes will be the Descovery Info if any (plRxXIDInfoState) clr plPosition ;Clear position for next state retp ;********** fl2plRxData - RxXIDInfo State ********** plRxXIDInfo mov w, plData ;Get data byte jmp @pl2lapRxXIDData ;Pass data to lap layer ;******************************************************************************** ; PAYLOAD LAYER - Receiving SNRM Frame ;******************************************************************************** ;********** fl2plRxData - RxSNRMSource State ********** plRxSNRMSource = plRxStoreSource ;********** fl2plRxData - RxSNRMDest State ********** plRxSNRMDest = plRxTestDest ;********** fl2plRxData - RxSNRMAddr State ********** plRxSNRMAddr mov plSNRMConnAddr, plData ;Store ConnAddr (only apply if frame is validated) mov plSNRMBaudRate, #%00000010 ;If no baud rate received then default to 9600 (bit 1 indicates 9600) inc plState ;#plRxSNRMParamTypeState - Next bytes are the negioation parameters retp ;********** fl2plRxData - RxSNRMParam State ********** plRxSNRMParamType inc plState ;#plRxSNRMParamSizeState - Next byte will state how many bytes of data csne plData, #$01 ;Receiving type $01 = baud rate ? setb plSNRMBaudRate.0 ;Yes => Set flag to indicate receiving baud rate (bit 0 is normally used to indicate 2400 which we do not support thus will be removed later) retp ;No => continue plRxSNRMParamSize mov plPosition, plData ;RxData states how many bytes of data inc plState ;#plRxSNRMParamDataState - Next bytes will be the param data retp plRxSNRMParamData decsz plPosition ;Decrement counter; Zero ? jmp :More ;No => wait for more mov plState, #plRxSNRMParamTypeState ;Yes => Next byte will be another parameter :More sb plSNRMBaudRate.0 ;Is this byte the first byte of the baud rate parameter retp ;No => ignore mov w, plData ;Get baud rate parameter and w, #%00111110 ;And with our supported baud rates = 9600(bit 1), 19200(bit 2), 38400(bit 3) 57600(bit 4) 115200(bit 5) mov plSNRMBaudRate, w ;Store in SNRMBaudRate (note bit 0 is now clear => will correctly ignore next byte of parameter if it is a 2 byte parameter) setb plSNRMBaudRate.1 ;Force 9600 to be valid retp ;******************************************************************************** ; PAYLOAD LAYER - Tx ;******************************************************************************** plTxFooter ;w = Addr, m = Addr / 256 add w, plPosition ;Add offset inc plPosition ;Increment offset for next byte iread mov Temp, w ;Store data mov w, m ;Move high part of data to w test w ;Is this the last byte ? jnz :Last ;Yes => Jump mov w, Temp ;Data byte to be transmitted clz ;Indicate more data to follow retp ;Return data to framing layer :Last mov plState, #plTxCompleteState ;Last byte => change to complete state mov w, Temp ;Data byte to be transmitted stz ;Indicate complete retp ;Return data to framing layer plTxSelfAddr mov w, #plSelfAddr ;pointer to SelfAddress variable add w, plPosition ;add offset mov FSR, w ;Now can indirectly access inc plPosition ;Move offset ready for next byte of SourceAddr cse plPosition, #4 ;Sent all 4 bytes ? jmp :Send ;No => Send current byte (stay in this state) inc plState ;Yes => Send current byte (next state) clr plPosition :Send mov w, INDF ;Byte of Source Address clz ;Indicate more data to follow retp ;Return data to framing layer plTxDestAddr mov w, #plDestAddr ;pointer to recorded DestAddress variable add w, plPosition ;add offset mov FSR, w ;Now can indirectly access inc plPosition ;Move offset ready for next byte cse plPosition, #4 ;Sent all 4 bytes ? jmp :Send ;No => Send current byte (stay in this state) inc plState ;Yes => Send current byte (Next will send Discovery flags) clr plPosition :Send mov w, INDF ;Byte of Source Address clz ;Indicate more data to follow retp ;Return data to framing layer ;******************************************************************************** plTxCmdStart mov plState, #plTxAddressState ;First byte = address mov plTxAddressByte, plConnAddr ;Address = ConnAddr setb plTxAddressByte.0 ;Indicate Cmd frame jmp @pl2flTxFrame ;Ask to framing layer to start a new frame plTxRspStart mov plState, #plTxAddressState ;First byte = address mov plTxAddressByte, plConnAddr ;Address = ConnAddr clrb plTxAddressByte.0 ;Indicate Cmd frame jmp @pl2flTxFrame ;Ask to framing layer to start a new frame ;********** fl2plTxData - TxAddress State ********** plTxAddress inc plState ;After address will send command mov w, plTxAddressByte ;Send Address clz ;Indicate more data to follow retp ;Return Data to framing layer ;********** fl2plTxData - TxCommand State ********** plTxCommand mov plState, plTxPostCommand ;After command will change to state given in TxIState clr plPosition ;Clear position just in case needed for following states csne plState, #plTxCompleteState ;Is this the last byte to be sent ? jmp :Last ;Yes mov w, plCommand ;Send Command clz ;Indicate more data to follow retp ;Return Data to framing layer :Last mov w, plCommand ;Send Command stz ;Indicate complete retp ;Return Data to framing layer ;******************************************************************************** ; PAYLOAD LAYER - Send Simple Frame ;******************************************************************************** lap2plTxSimpleCmd ;Transmit a frame of type specified in w bank plBank mov plCommand, w ;Store command in plCommand mov plTxPostCommand, #plTxCompleteState ;After address & command frame will be complete jmp plTxCmdStart ;Set State and Address, and ask framing layer to start frame lap2plTxSimpleRsp ;Transmit a frame of type specified in w bank plBank mov plCommand, w ;Store command in plCommand mov plTxPostCommand, #plTxCompleteState ;After address & command frame will be complete jmp plTxRspStart ;Set State and Address, and ask framing layer to start frame ;******************************************************************************** ; PAYLOAD LAYER - Send I Frame ;******************************************************************************** lap2plTxIRsp bank plBank mov plCommand, w ;Store command in plCommand mov plTxPostCommand, #plTxIDataDLSAPState ;After address & command will send data jmp plTxRspStart ;Set State and Address, and ask framing layer to start frame plTxIDataDLSAP inc plState ;Next state = plTxIDataSLSAP mov w, plIDataDLSAP ;Send DLSAP byte debug IFrameDataTx ;Show debug info clz ;Indicate more data to follow retp plTxIDataSLSAP inc plState ;Next state = plTxIDataData mov w, plIDataSLSAP ;Send SLSAP byte debug IFrameDataTx ;Show debug info clz ;Indicate more data to follow retp plTxIDataData call @pl2lapTxIData ;Get next byte to be transmitted (returns z = false if data) debug IFrameDataTx ;Show debug info snz ;Is the z flag set (Last byte) ? jmp :Last ;Yes => jump retp ;Z is still clear indicating more data to follow :Last mov Temp, w ;Backup data bank plBank mov plState, #plTxCompleteState ;New state = Wait for complete indication mov w, Temp ;Recover data stz ;Indicate no more data to follow retp ;******************************************************************************** ; PAYLOAD LAYER - Send UI Frame ;******************************************************************************** plTxUICmd bank plBank mov plCommand, #uUICmd ;Store command in plCommand mov plTxPostCommand, #plTxUIDataState ;After address & command will send data jmp plTxCmdStart ;Set State and Address, and ask framing layer to start frame plTxUIData call @pl2lapTxUIData ;Get next byte to be transmitted (returns z = false if data) snz ;Is the z flag set (Last byte) ? jmp :Last ;Yes => jump retp ;Z is still clear indicating more data to follow :Last mov Temp, w bank plBank mov plState, #plTxCompleteState ;New state = Wait for complete indication mov w, Temp ;Recover data stz ;Indicate no more data to follow retp ;******************************************************************************** ; PAYLOAD LAYER - Send XID Frame ;******************************************************************************** ;********** lap2plTxXIDCmd ********** lap2plTxXIDCmd bank plBank mov plXIDSlot, w ;Store slot number mov plCommand, #uXIDCmd ;Command = XID command mov w, #$FF mov plDestAddr+0, w ;Dest address = FFFFFFFF mov plDestAddr+1, w ;Dest address = FFFFFFFF mov plDestAddr+2, w ;Dest address = FFFFFFFF mov plDestAddr+3, w ;Dest address = FFFFFFFF mov plXIDFlags, #2 ;Set flags = 2 (=> 8 slots) mov plFrameType, #uXIDCmdFrame ;Rember that this is a XID Command Frame mov plTxPostCommand, #plTxXIDFormatState ;After address & command will send format jmp plTxCmdStart ;Set State and Address, and ask framing layer to start frame ;********** lap2plTxXIDRsp ********** lap2plTxXIDRsp bank plBank mov plCommand, #uXIDRsp ;Command = XID response mov plFrameType, #uXIDRspFrame ;Rember that this is a XID Response Frame mov plTxPostCommand, #plTxXIDFormatState ;After address & command will send format jmp plTxRspStart ;Set State and Address, and ask framing layer to start frame ;********** fl2plTxNext - TxXIDFormat State ********** plTxXIDFormat ;Send XID Format byte inc plState ;Next will send source mov w, #1 ;Format = 1 clz ;Indicate more data to follow retp ;Return data to framing layer ;********** fl2plTxNext - TxXIDSource State ********** plTxXIDSource = plTxSelfAddr ;********** fl2plTxNext - TxXIDDest State ********** plTxXIDDest = plTxDestAddr ;********** fl2plTxNext - TxXIDFlags State ********** plTxXIDFlags inc plState ;After Flags will send slot number (plTxSlotState) mov w, plXIDFlags ;Reply with same flags as received command frame clz ;Indicate more data to follow retp ;Return data to framing layer ;********** fl2plTxNext - TxXIDSlot State ********** plTxXIDSlot csne plFrameType, #uXIDRspFrame ;Is the frame a XID response frame ? jmp :Footer ;Yes => must send footer csne plXIDSlot, #$FF ;Is the slot number FF ? jmp :Footer ;Yes => must send footer mov plState, #plTxXIDVersionState ;No => Send slot followed by version only jmp :Send :Footer mov plState, #plTxXIDFooterState clr plPosition ;Set to 0 ready for footer :Send mov w, plXIDSlot ;Transmit slot number clz ;Indicate more data to follow retp ;Return data to framing layer ;********** fl2plTxNext - TxXIDVersion State ********** plTxXIDVersion mov plState, #plTxCompleteState ;After version will indicate complete mov w, #0 ;Version = 0 stz ;Indicate complete retp ;Return data to framing layer ;********** fl2plTxNext - TxXIDFooter State ********** plTxXIDFooter mov m, #_plXIDFooter / 256 ;Pointer to string (high) mov w, #_plXIDFooter ;Pointer to string jmp plTxFooter ;******************************************************************************** ; PAYLOAD LAYER - Send UA Connection Frame ;******************************************************************************** lap2plSNRMAccept bank plBank mov plCommand, #uUARsp ;Send UA packet to accept connection mov plConnAddr, plSNRMConnAddr ;Apply connection address setb plConnAddr.0 ;Only accept command frames mov plTxPostCommand, #plTxUASourceState ;After address & command will send source jmp plTxRspStart ;Set State and Address, and ask framing layer to start frame plTxUASource = plTxSelfAddr plTxUADest = plTxDestAddr plTxUABaudRate ;Send $01, $01, BaudRate inc plPosition csne plPosition, #3 ;Is position 3 indicating to send BaudRate ? jmp :Baud ;Yes => send BaudRate mov w, #$01 ;Data to send = $01 clz ;Indicate more data to follow retp ;Return data to framing layer :Baud inc plState ;Next state = plTxUAParamState clr plPosition ;Clear position ready for next state mov w, plSNRMBaudRate ;Data to send = BaudRate clz ;Indicate more data to follow retp ;Return data to framing layer plTxUAParam mov m, #_plSNRMParam / 256 ;Pointer to string (high) mov w, #_plSNRMParam ;Pointer to string jmp plTxFooter ;******************************************************************************** ENDM PayloadString1 MACRO ;******************************************************************************** ; PAYLOAD LAYER - String ;WARNING - Strings must not go over a 256 boundry !!! ;******************************************************************************** _plUCommands ;Must be in the same order as the FrameType constants !!! _plUCommand6 dw uUICmd ;UICmd or UIRsp (same command) _plUCommand7 dw uDISCCmd ;DISCCmd or RDRsp (same command) _plUCommand8 dw uUARsp ;UARsp _plUCommand9 dw uSNRMCmd ;SNRMCmd or RNRMRsp (same command) _plUCommand10 dw uTESTCmd ;TESTCmd or TESTRsp (same command) _plUCommand11 dw uFRMRRsp ;FRMRRsp _plUCommand12 dw uDMRsp ;DMRsp _plUCommand13 dw uXIDCmd ;XIDCmd _plUCommand14 dw uXIDRsp + $F00 ;XIDRsp (F00 indicates end of string) ;******************************************************************************** ENDM PayloadString2 MACRO ;******************************************************************************** ; PAYLOAD LAYER - String ;WARNING - Strings must not go over a 256 boundry !!! ;******************************************************************************** ;_plSNRMParam1 dw $01, 1, %00000010 ;Baud Rate = 9600 bps Flexible _plSNRMParam _plSNRMParam2 dw $82, 1, %00000001 ;Turnaround = 500 ms Solid _plSNRMParam3 dw $83, 1, %00000001 ;Data Size = 64 bytes Flexible ? _plSNRMParam4 dw $84, 1, %00000001 ;Window Size = 1 Solid _plSNRMParam5 dw $85, 1, %10000000 ;Additional BOFs = 0 Solid _plSNRMParam6 dw $86, 1, %00000011 ;Min turnaround = 5/10 ms Solid to IrDA Transeiver spec _plSNRMParam7 dw $08, 1, %00000001+$F00 ;Disconnect = 3 s Solid ;******************************************************************************** ENDM PayloadString3 MACRO ;******************************************************************************** ; PAYLOAD LAYER - String ;WARNING - Strings must not go over a 256 boundry !!! ;******************************************************************************** _plXIDFooter _plXIDVersion dw 0 ;Version = 0 (only possible) _plXIDHints dw $80, $04 ;Hints = IrComm _plXIDCharset dw 0 ;Charset = ASCII _plXIDNickname dw 'SX IrComm Device'+$F00 ;Nickname ($F00 indicates end) ;******************************************************************************** ENDM
file: /Techref/scenix/lib/io/osi2/ir/da/Payload.src, 32KB, , updated: 1999/8/20 18:50, local time: 2024/11/9 06:48,
3.148.113.180:LOG IN ©2024 PLEASE DON'T RIP! THIS SITE CLOSES OCT 28, 2024 SO LONG AND THANKS FOR ALL THE FISH!
|
©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://techref.massmind.org/Techref/scenix/lib/io/osi2/ir/da/Payload.src"> scenix lib io osi2 ir da Payload</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.