Extension for LPT access on Windows 98/NT/XP/2k/XP, by ZP Engineering srl [L1 ]
This is a reference page for lpttcl; see also Parallel port for a more general introduction.
Download version 3.0 from [L2 ].
Download version 1.0 from [L3 ].
Commands summary
.... both versions.... lpt_getba returns base address of selected LPT lpt_setba <addr> selects LPT at base address <addr> lpt_rddata returns LPT data register value lpt_rdstat returns LPT status register value lpt_rdctrl returns LPT control register value lpt_wrdata <val> writes <val> to LPT data register lpt_wrstat <val> writes <val> to LPT status register lpt_wrctrl <val> writes <val> to LPT control register ... only in version 3.0 .... lpt_rdreg <offset> generic register read at (base_address + offset) lpt_wrreg <offset> <val> generic register write at (base_address + offset) lpt_setport <id> selects LPT<id>, where <id> = 1,2,3,...; lpt_getport returns 1,2,.... (lpt_getba returns -1 if lpt_setport points to a non-existing LPT) (lpt_setba now accepts a 32-bit value) ----
Basic startup code
console show wm withdraw . load lpttcl set ver [package require lpttcl] puts [format "LPTTCL, version %s" $ver] puts "---------------------" puts [format "Current port: LPT%d" [lpt_getport]] puts [format "Base address: 0x%08X" [lpt_getba]] puts " " puts [format "Data register: 0x%04X" [lpt_rdreg 0]] puts [format "Status register: 0x%04X" [lpt_rdreg 1]] puts [format "Control register: 0x%04X" [lpt_rdreg 2]] puts [format "Extended control register: 0x%04X" [lpt_rdreg 0x402]]
and its output on a console:
LPTTCL, version 3.0 --------------------- Current port: LPT1 Base address: 0x00000378 Data register: 0x00AA Status register: 0x0078 Control register: 0x000C Extended control register: 0x0015
Utilities
Note that in ver. 3.0 you can now perform a quick autoscan of available LPT ports:
proc LPTscan {{nmax 8}} { for {set i 1} {$i < $nmax} {incr i} { lpt_setport $i if {[lpt_getba] == -1} { puts "LPT$i absent" } else { puts "LPT$i present" } } }
We made some profiling of access speed (when you insert real code in the loop, it goes slower); note that the test is compatible with both versions.
proc toggle {num} { for {set i 0} {$i < $num} {incr i} { lpt_wrdata 0x55 lpt_wrdata 0xAA } } proc getmaxfreq {{ntimes 10000}} { set tt [time {toggle $ntimes}] scan $tt %i tt set mf [expr (2000 * $ntimes / $tt)] ;# 2 writes, expressed in kHz puts "Max frequency is $mf kHz" }
Some results (using freewrap 5.4, based on Tcl/tk 8.3.5) using getmaxfreq:
The old version runs faster (around 2,5 times faster on some PCs!!); furthermore, newer tcl versions are slower. As an example, we measured that 8.3.5 (freewrap) is about 20% faster than 8.4.7 (activestate).