' FILE: CMV_PP.BAS CLS PRINT "Demonstration of using CMV586/486 parallel port in bi-directional mode" PRINT PRINT "(c) 1997 by Real Time Devices, Inc. State College, PA 16804." PRINT : PRINT '-------------------------------------------------------------------------- 'EXPLANATION ' ' To use the CMV586/486 parallel port in bi-directional mode, you ' must first change the I/O chip configuration register so the port ' is in EPP mode. This requires the following steps: ' ' 1) select configuration register BE using the index register. ' 2) write config register BE to enable EPP mode. ' ' NOTE! Make certain you do not change any other bits in ' configuration registers!! ' ' After enabling EPP mode, you can access the printer port registers ' (data port, status port, control port) directly to read the input ' pins, write the output pins, etc. The bits of these registers are ' described below. Note that many of the pins are inverted between ' the register and the physical I/O pins. ' ' Please note that this program is written for a parallel port at ' base address $378. You must change the CONST if you wish to use ' a parallel port at another address. ' '-------------------------------------------------------------------------- 'REGISTER MAP ' ' $F2 IndexPort I/O chip index port ' $F3 DataPort I/O chip data port ' ' CONFIGURATION REGISTER BE ' BE: { 7:0 } ' bit {7} : ENHANCED PARALLEL PORT ' 0= enable ' 1= disable ' bit {6} : RESERVED ' DO NOT CHANGE!!!! ' bit {5} : PORT EXTENDED MODE ' 0= normal mode ' 1= extended/bidirectional mode ' bit {4} : PORT DISABLE ' 0= enable ' 1= disable ' bit {3} : PORT POWER DOWN ' 0= normal ' 1= power down ' bit {2-0} : RESERVED ' DO NOT CHANGE!!!! ' ' PRINTER DATA REGISTER ' PDR: { 7:0 } ' bit {7,0} : DATA BITS ' data bits 0-7 for both input and output ' ' PRINTER STATUS REGISTER ' PCR: { 7:0 } ' bit { 7 } : BUSY ' 0=external BUSY input is low ' 1=external BUSY input is high ' bit { 6 } : ACK ' 0=external ACK input is low ' 1=external ACK input is high ' bit { 5 } : PAPER END ' 0=external paper end input is low ' 1=external paper end input is high ' bit { 4 } : SELECT INPUT ' 0=external SLCT input is low ' 1=external SLCT input is high ' bit { 3 } : ERR ' 0=external ERR pin is high ' 1=external ERR pin is low ' bit {2,1} : RESERVED ' always read as 1's ' bit { 0 } : TIMEOUT ' 0=no timeout has occurred ' 1=timeout has occurred ' ' PRINTER CONTROL REGISTER ' PCR: { 7:0 } ' bit {7,6} : reserved ' bit { 5 } : PORT DIRECTION ' 0=output to port, 1=input from port ' bit { 4 } : IRQ REQUEST ENABLE ' 0=disable interrupt ' 1=enable interrupt on ACK signal rising edge ' bit { 3 } : SLCT ' 0=external SLCT pin is high ' 1=external SLCT pin is low ' bit { 2 } : INIT ' 0=external INIT pin is low ' 1=external INIT pin is high ' bit { 1 } : AFD ' 0=external AFD pin is high ' 1=external AFD pin is low ' bit { 0 } : STROBE ' 0=external STROBE pin is high ' 1=external STROBE pin is low ' '-------------------------------------------------------------------------- CONST IndexPort = &HF2 'index port is at $F2 CONST DataPort = &HF3 'data port is at $F3 CONST CRBEIndex = &HBE 'index for config register BE ' CONST BaseAddress = &H378 'parallel port base address assumed $378 ' CONST PDR = BaseAddress + 0 'parallel port data register CONST PSR = BaseAddress + 1 'parallel port status register CONST PCR = BaseAddress + 2 'parallel port control register '************************************************************************** 'INITIALIZE ' ENTER CONFIG MODE OUT IndexPort, CRBEIndex 'load index register to point to CR dat! = INP(DataPort) 'read present contents of CR ' SELECT EPP MODE TO ALLOW BI-DIRECTIONAL USE dat! = dat! AND &H5F 'clear bits {7,5} dat! = dat! OR &H20 'set bits {7,5} to {0,1} OUT DataPort, dat! 'write back new value '************************************************************************** 'MAIN PROGRAM LOOP DO 'prompt for command PRINT "------------------------------------------" PRINT "Press R to read data port" PRINT " W to write data port" PRINT " ? to read status port" PRINT " S to toggle STROBE pin" PRINT " A to toggle AFD pin" PRINT " I to toggle INIT pin" PRINT " L to toggle SLCT pin" PRINT " or {ESC} to exit" PRINT PRINT "Choice: "; DO 'wait for a valid keypress x$ = INKEY$ LOOP UNTIL x$ <> "" PRINT x$ PRINT x$ = UCASE$(x$) 'convert to uppercase IF x$ = "R" THEN y! = INP(PCR) 'read control port y! = y! OR &H20 'set bit {5} to OUT PCR, y! 'set port to input mode z! = INP(PDR) 'now read port data PRINT "Data port = "; HEX$(z!) END IF IF x$ = "W" THEN y! = INP(PCR) 'read control port y! = y! AND &HDF 'clear bit {5} to OUT PCR, y! ' set port to output mode INPUT "Enter data (0-255):"; z! OUT PDR, z! 'set new value PRINT "Data port set to = "; HEX$(z!) END IF IF x$ = "?" THEN y! = INP(PSR) 'read status port PRINT "Status port = "; HEX$(y!) END IF IF x$ = "S" THEN y! = INP(PCR) 'read control port contents y! = y! XOR (&H1) 'toggle bit OUT PCR, y! 'put back PRINT "STROBE toggled" END IF IF x$ = "A" THEN y! = INP(PCR) 'read control port contents y! = y! XOR (&H2) 'toggle bit OUT PCR, y! 'put back PRINT "AFD toggled" END IF IF x$ = "I" THEN y! = INP(PCR) 'read control port contents y! = y! XOR (&H4) 'toggle bit OUT PCR, y! 'put back PRINT "INIT toggled" END IF IF x$ = "L" THEN y! = INP(PCR) 'read control port contents y! = y! XOR (&H8) 'toggle bit OUT PCR, y! 'put back PRINT "SLCT toggled" END IF IF x$ = CHR$(27) THEN EXIT DO 'if key is {ESC}, exit LOOP STOP END