private void parseRxResponse() throws IOException {
		//TODO untested after 64-bit refactoring
		if (apiId == ApiId.RX_16_RESPONSE || apiId == ApiId.RX_64_RESPONSE) {
			if (apiId == ApiId.RX_16_RESPONSE) {
				response = new RxResponse16();	
				((RxBaseResponse)response).setSourceAddress(this.parseAddress16());
			} else {
				response = new RxResponse64();
				((RxBaseResponse)response).setSourceAddress(this.parseAddress64());
			}
		} else {
			response = new RxResponseIoSample();
			
			if (apiId == ApiId.RX_16_IO_RESPONSE) {
				((RxBaseResponse)response).setSourceAddress(this.parseAddress16());	
			} else {
				((RxBaseResponse)response).setSourceAddress(this.parseAddress64());
			}	
		}
		
		int rssi = this.read("RSSI");
		
		// rssi is a negative dbm value
		((RxBaseResponse)response).setRssi(-rssi);
		
		int options = this.read("Options");
		
		((RxBaseResponse)response).setOptions(options);
		
		if (apiId == ApiId.RX_16_RESPONSE || apiId == ApiId.RX_64_RESPONSE) {
			int[] payload = new int[length.getLength() - this.getFrameDataBytesRead()];
			
			int bytesRead = this.getFrameDataBytesRead();
			
			for (int i = 0; i < length.getLength() - bytesRead; i++) {
				payload[i] = this.read("Payload byte " + i);
				//log.debug("rx data payload [" + i + "] " + payload[i]);
			}				
			
			((RxResponse)response).setData(payload);
		} else {
			// I/O sample
			log.debug("this is a I/O sample!");
			((RxResponseIoSample)response).parse(this);
		}
	}