DOSBOX虚拟环境能在WIN10和LINUX平台上支持DOS、WIN3x、Win9x程序运行。串口是当年计算机硬件的标配,经RS232-RS485转换后轻松实现远距离数据通讯,这些当年的程序和设备在今天的DOSBOX下也还是可以使用的。DOS、QuickBasic、TurboBasic、PowerBasic,都曾经陪伴了许多人的青春年华,回味起来既温馨又充实,至今依然很耐人玩味,因此,还是把心得体会写下来。
DOSBOX不仅支持串口,还支持打印口和游戏口。串口和打印口都有Direct I/O能力,游戏口也是如此,而DOSBOX中的程序大多是实模式下运行的,通过Direct I/O即可在串口、并口、游戏口的支持下与外部硬件打交道(其它非标口是不行的)。在QBasic、TBasic、PBasic的On COM(n), On Strig(n)支持下,串口游戏口又都是优于60ms的中断源,合理安排下做中断处理还是比较容易使用的(优先级高的中断会中断优先级低的中断)。反正就是拿它玩的,也不必纠结太多其它什么东西,能用就好。
想让DOSBOX支持串口,要在它的CONF文件中配置一下串口。真实串口要映射成DOSBOX的串口,一般就一对一好了。将serial1?????? = dummy改成serial1?????? = directserial realport:COM1,这样真实串口就挂到了DOSBOX的串口serial1,即DOSBOX的COM1口。
[Serial]
serial1?????? = directserial realport:COM1
串口通讯是既让人兴奋又让人讨厌的东西,无论你在哪个BASIC下常规使用它都有毛病,在数据读取时会出问题,要么缓冲区溢出程序不运行了,要么串口线断线程序死着不动了。研华的STD-DRV能支持四个普通串口,在DOS下调用它的函数比BASIC带的OPEN类的东西好用多了,它是不加密的,移动哪个DOS下都能使用,而用还带C、BASIC、CLIPPER等SAMPLE程序。只是,把它用到DOSBOX下时就不好用了。其实,直接操作串口的状态和数据寄存器就方便了,而且DOSBOX支持这种直接操作。下面是个TuroBasic的实验程序,在其它BASIC下应该也是运行的,这些平台都差不多而且应该是代码兼容的。
ON ERROR GOTO ERRORTRAP1
'TURBOBASIC DOESN'T ALLOW ON_ERROR_ RESUME_NEXT, USE GOTO INSTEAD
CLS
'SET COM1 BAUD RATE AND MODE
OUT &H3F8 + 3, &H80
OUT &H3F8 + 0, &H0C
OUT &H3F8 + 1, &H00
OUT &H3F8 + 3, &H03
OUT &H3F8 + 4, &H00
OUT &H3F8 + 1, &H00
ZZZ=32
DO WHILE INKEY$<>CHR$(27)
ZZZ = ZZZ + 1
FOR L = 1 TO 1000
COMSTATUSOUT = INP(&H3F8 + 5)
IF (COMSTATUSOUT AND &H20) = &H20 THEN
OUT &H3F8, ZZZ
EXIT FOR
END IF
NEXT L
IF ZZZ >= 126 THEN ZZZ = 32
FOR L = 1 TO 1000
COMSTATUSIN = INP(&H3F8+5)
IF (COMSTATUSIN AND 1) <> 0 THEN
FFF$ = CHR$(INP(&H3F8)): PRINT FFF$+" ";
EXIT FOR
END IF
NEXT L
LOOP
END
'TURBOBASIC DOESN'T ALLOW ON_ERROR_ RESUME_NEXT, USE A SUBROUTINE INSTEAD
ERRORTRAP1:
RESUME NEXT
这段程序是寄存器直接发送和接收,然后显示ASCII字符到屏幕上。因为不存在INPUT类的内部等待,和其它封闭起来的毛病,因此,即使是串口线断了,最多是收不到数据,一旦恢复连接则数据又开始接收了,这在与外部硬件实时打交道时可靠多了。如果发送端定义成!nnn#类指令,那收到指令时可按指令行事了,与Adam或NuDam模块类似了,与单片机打交道也可以如此操作。看看它的实际输出吧。
?
这是将九针串口的2和3脚,TxD和RxD连在一起得到的即时收发反应,正常情况下是稳稳的不丢失字符的。
除了如此操作之外,DOSBOX还可借助PCAP或SLIRP联网,不过是有局限的。毕竟DOSBOX不是基于虚拟网卡结构的,它没有虚拟网上就只能寄生在物理网卡,从底层收发数据,就是CAP抓包数据或叫截获数据,这网联得好像不怎么正道似的,但却是能联接上网的。
另外就是共享数据,DOSBOX和主机WINx用的是相同的文件系统,通过对文件系统的加解锁就可以将砂箱DOSBOX中的数据文件共享给主机程序读取。DOSBOX对文件加锁,写完数据关闭文件,释放文件锁;主机程序加锁文件,读取数据,并释放文件锁。这种方法做大数据交换还算方便吧,怎么也比串口收发数据方便,如果Mount的是Ramdisk那还可以不停的读写操作提高数据交换的即时性。
总之,DOS虽然老,但在64位Win10和Linux上还是能用的。相比Mono和Wine, DOSBOX轻便多了,不用建一堆Windows的目录结构和注册表。Watcom c/c++带上Pmode/W,DOSBOX下的DOS也能保护模式编程,上Win3x和Win9x也挺好玩的。
|