3

私は DoxBox エミュレーター用のシリアル マウスをエミュレートするためにいくつかのことを試みてきました (Settlers 2 で 2 プレイヤー ゲームをプレイするため)。

私はまだ実用的な解決策を見つけていないので、自分で作ってみました。dosbox は任意の /dev/ttyS* をシリアル入力として使用できるようです。そこで、FIFO にビットを直接書き込んで、シリアル マウスのマスカレードを行うべきだと考えました。残念ながら、いくつかの手順が明らかに欠けているため(特に初期化、ドライバーにマウスであることを伝えますか?)、実際には機能しません。また、シリアルポートの仕組みを本当に理解していないように感じます。

Microsoft シリアル マウスプロトコル以外のマウス プロトコルについては、あまり見つけられませんでした。妥当なバイト数を出力してみました。しかし、実際には何も起こらないようで、dosbox はシリアルポートを開くことができないと言います。

これが私が実装したものです:

def bits(byte):                                                                                                                                         
    b = []                                                                               
    for i in xrange(8):                                                                                                                                 
        b.append((byte >> i) & 1)                                                                                                                       
    return b                                                                                                                                            
def pack(*args):
    # packs the bits into a string                                                                                                                                        
    s = ""                                                                                                                                              
    for i in args:                                                                                                                                      
        v = 0                                                                                                                                           
        for bit in i:                                                                                                                                   
            v = v<<1                                                                                                                                    
            v+=bit                                                                                                                                      
        s+=chr(v)                                                                                                                                       
    return s                                                                                                                                            
def makebytes(ld,rd,dx,dy): 
    # left down, right down, delta x, delta y                                                                                   
    # create 3 byte message for mouse
    dx = bits(dx)                                                                                                                                       
    dy = bits(dy)                                                                                                                                       
    A = [0,1,                                                                                                                                           
         1 if ld else 0,                                                                                                                                
         1 if rd else 0,                                                                                                                                
         dx[7],dx[6],                                                                                                                                   
         dy[7],dy[6]]                                                                                                                                   
    B = [0,0]+dx[::-1][2:]                                                                                                                              
    C = [0,0]+dy[::-1][2:]                                                                                                                              
    return pack(A,B,C)                                                                                                                                  
# this is the FIFO I created with go+rw                                                                                                                                              
f = file("/dev/ttyS42",'w')                                                                                                                             
print "Got"                                                                                                                                          
import time                                                                                                                                             
while 1:                                                                                                                                                
    # send some mouse movement                                                                                                                                                    
    f.write(makebytes(0,0,10,10))                                                                                                                         
    print "sent 1"                                                                                                                                        
    time.sleep(0.5)                                                                                                                                     
    f.write(makebytes(0,0,-10,-10))                                                                                                                       
    print "sent 2"

だから、今どこを見ればいいのかわからないので、助けていただければ幸いです。

4

2 に答える 2

4

DosBox のソースを見ると、dosbox がシリアル ポートを処理する方法が原因で、FIFO を使用するのに問題があるようです。

src/hardware/serialport/libserial.cppの 295 行目で、シリアル デバイスが unices でどのように開かれているかがわかります 。

cp->porthandle = open (extended_portname, O_RDWR | O_NOCTTY | O_NONBLOCK);

いずれにせよ、FIFO で O_RDWR を使用すると、指定されていない動作が発生します ( O_RDWR についてはopen(3)を参照)。

さらに、open()呼び出しが成功しても、DosBox シリアル lib がデバイスの端末属性を取得しようとするとブロックされます (同じファイルの 298 行目)。

result = tcgetattr(cp->porthandle,&cp->backup);

tcgetattr()termiosFIFO からデータを取得できないため失敗します。

FIFO はデバイスをエミュレートする方法ではないと思います。独自のカーネル モジュールをロールするか、dosbox を変更するか、外部アダプターを使用してシリアル ポートに物理的な 2 つ目のマウスを接続する必要があります。

于 2012-06-20T15:10:52.740 に答える
3

FIFO を使用する代わりに、疑似 TTYを試してみることをお勧めします。

于 2012-06-20T21:50:45.570 に答える