;;; machine isn't fast enough to catch the host's reply packet
;;; , the write and read functions must be "close" together.
;;; uint16_t dw_transaction( char *send, uint16_t scnt,
-;;; char *recv, uint16_t rcnt )
+;;; char *recv, uint16_t rcnt, uint8_t rawf )
;;; x=send cc y ret scnt recv rcnt
;;; Brett M. Gordon
_dw_transaction:
pshs cc,y ; save caller
orcc #0x50 ; stop interrupts
- ldy 5,s ; Y = number of bytes to send
- beq out@ ; no byte to write - leave
+ tstb ; rawflag?
+ beq skip@ ; nope - then skip switching to process map
+ jsr map_process_always
+skip@ ldy 5,s ; Y = number of bytes to send
+ beq ok@ ; no byte to write - leave
jsr DWWrite ; send to DW
ldx 7,s ; X is receive buffer
ldy 9,s ; Y = number of bytes to receive
- beq out@ ; no bytes to send - leave
+ beq ok@ ; no bytes to send - leave
jsr DWRead ; read in that many bytes
bcs frame@ ; C set on framing error
bne part@ ; Z zet on all bytes received
-out@ ldx #0 ; no error
+ok@ ldx #0 ; no error
+out@ jsr map_kernel
puls cc,y,pc ; return
frame@ ldx #-1 ; frame error
- puls cc,y,pc ; return
+ bra out@
part@ ldx #-2 ; not all bytes received!
- puls cc,y,pc ; return
+ bra out@
+
-
_dw_reset:
; maybe reinitalise PIA here?
; and send DW_INIT request to server?
"dw_transaction" routine/function:
int16_t dw_transaction( char *send, uint16_t scnt,
- char *recv, uint16_t rcnt )
+ char *recv, uint16_t rcnt, uint8_t rawf )
where "send" is a data buffer to send
"scnt" is the size of the send buffer
"recv" is a data buffer for the received reply
"rcnt" is the size of the recv buffer
+ "rawf" rd/wr drirectly to userspace
returns: 0 on no error
-1 on DW reception framing error (too slow!!)
-2 on not all bytes received
unsigned char buf[2];
buf[0]=DW_FASTWRITE | dw_port( minor ) ;
buf[1]=c;
- dw_transaction( buf, 2, NULL, 0 );
+ dw_transaction( buf, 2, NULL, 0, 0 );
}
buf[1]=dw_port( minor );
buf[2]=DW_VOPEN;
if( ! ( p->flags & DW_FLG_OPEN ) ){
- dw_transaction( buf, 3, NULL, 0 );
+ dw_transaction( buf, 3, NULL, 0, 0 );
open_ports++;
}
p->flags |= DW_FLG_OPEN;
buf[1]=dw_port( minor );
buf[2]=DW_VCLOSE;
if( p->flags & DW_FLG_OPEN ){
- dw_transaction( buf, 3, NULL, 0 );
+ dw_transaction( buf, 3, NULL, 0, 0 );
}
}
/* up to four transactions at a poll */
for( i=0; i<4; i++){
buf[0]=DW_SERREAD;
- dw_transaction( buf, 1, buf, 2 );
+ dw_transaction( buf, 1, buf, 2, 0 );
/* nothing waiting ? */
if( ! (buf[0] & 0x7f) ) {
wait=MAX_WAIT;
wait=1;
break;
}
- dw_transaction( b,3,tbuf, min );
+ dw_transaction( b,3,tbuf, min, 0 );
for( i=0; i<min; i++){
tty_inproc( minor, tbuf[i] );
}
unsigned char buf[2];
buf[0]=DW_INIT;
buf[1]=0x42;
- dw_transaction( buf,2,buf,1 );
+ dw_transaction( buf,2,buf,1,0 );
}