home *** CD-ROM | disk | FTP | other *** search
- sUBJECT: rE: cbm PRINTER TO ibm
- nEWSGROUPS: COMP.SYS.CBM
- dATE: tHU, 14 nOV 1996 20:50:17 -0800
- oRGANIZATION: nORTEL iNFORMATION nETWORKS
- pATH: NNTP.HUT.FI!NEWS.FUNET.FI!NEWSFEED.SUNET.SE!NEWS00.SUNET.SE!SUNIC!NEWS.SPRINTLINK.NET!NEWS-PEER.SPRINTLINK.NET!NEWS.MATHWORKS.COM!NEWSGATE.DUKE.EDU!INTERPATH!NEWS.INTERPATH.NET!NEWS.INTERPATH.NET!NEWS1.NORTEL.NET!NEWS
- lINES: 147
- mESSAGE-id: <328bf689.67eb@SANTEL.NET>
- rEFERENCES: <pINE.sol.3.91.961108234539.26708e-100000@ATL1>
- nntp-pOSTING-hOST: FILTER-SANT.NORTEL.NET
- mIME-vERSION: 1.0
- cONTENT-tYPE: TEXT/PLAIN; CHARSET=US-ASCII
- cONTENT-tRANSFER-eNCODING: 7BIT
- x-mAILER: mOZILLA 2.02e-kit (wIN16; u)
- cONTENT-dISPOSITION: INLINE; FILENAME="c64topc.txt"
-
- tHIS ARTICLE DESCRIBES HOW TO CONNECT A cOMMODORE 64 COMPATIBLE PRINTER TO
- AN ibm pc COMPATIBLE COMPUTER. tHE INFORMATION ORIGINALLY APPEARED IN AN
- ARTICLE THAT i WROTE FOR THE tECH fORUM SECTION OF THE mARCH 1995 ISSUE OF
- nUTS & vOLTS MAGAZINE. tHIS INFORMATION MAY BE USED AND DISTRIBUTED SO
- LONG AS PROPER CREDIT IS GIVEN TO THE AUTHOR AND nUTS & vOLTS MAGAZINE.
- cOPYRIGHT (c) 1995 BY jOHN kEYERLEBER AND nUTS & vOLTS mAGAZINE.
-
- tHE PROBLEM WITH cOMMODORE 64 COMPATIBLE PRINTERS IS THAT THESE DEVICES USE
- THE cOMMODORE SYNCHRONOUS SERIAL INTERFACE TO COMMUNICATE WITH THE c64. aN
- ibm pc COMPATIBLE PRINTER PORT IS A PARALLEL INTERFACE, HOWEVER IT IS
- POSSIBLE TO USE THIS PARALLEL PORT TO EMULATE THE c64 SERIAL INTERFACE BY
- CONSTRUCTING A SPECIAL CABLE AND WRITING A LITTLE BIT OF SOFTWARE.
-
- tHE CABLE IS USED TO CONNECT THE pc db25 PIN PARALLEL PRINTER PORT TO THE 6
- PIN din SERIAL PORT ON THE c64 COMPATIBLE PRINTER. tHE PARTS NEEDED ARE
- ONE db25 MALE CONNECTOR (rADIO sHACK #276-1429), ONE 6 PIN din PLUG (rs
- #274-020), AND SOME SIX CONDUCTOR CABLE (rs #278-874 OR EQUIVALENT). nOTE
- THAT THE CABLE LENGTH SHOULD BE KEPT TO LESS THAN SIX FEET. tHE WIRING
- CONNECTIONS AND SIGNAL DESCRIPTIONS FOR THIS CABLE ARE GIVEN AS FOLLOWS:
-
- cOMMODORE 64 din PLUG PIN: pARALLEL PRINTER db25 CONNECTOR PIN:
- 1 (srq in) 2 (data0)
- 2 (gnd) 20 (gnd)
- 3 (ser atn) 3 (data1)
- 4 (ser clk) 4 (data2)
- 5 (ser dat) 5 (data3) AND 11 (busy)
- 6 (rst) 6 (data4)
-
- tHE SOFTWARE USES THE pc PARALLEL PORT TO EMULATE A c64 SERIAL PORT. tHE
- EXAMPLE PROGRAM, c64.c (lISTING 1), IS WRITTEN IN bORLAND'S tURBO c. iT
- READS INPUT AND SENDS EACH CHARACTER TO THE PRINTER. iT CAN BE USED AS A
- FILTER IN AN ms-dos COMMAND LINE PIPE. fOR EXAMPLE, dos COMMANDS SUCH AS:
- DIR {$7c} C64 WOULD PRINT A DIRECTORY LISTING, OR TYPE A_FILE {$7c} C64 WOULD PRINT
- THE CONTENTS OF A FILE.
-
- i HAVE ALSO WRITTEN AN ms-dos DEVICE DRIVER WHICH CAN BE USED TO ALLOW ANY
- pc APPLICATION TO PRINT TO A c64 COMPATIBLE PRINTER, AND IT SUPPORTS
- MULTIPLE PRINTERS CONNECTED TO A SINGLE pc PARALLEL PORT. tHE LISTING FOR
- THIS SOFTWARE IS TOO LENGTHY TO PRINT, HOWEVER i WILL MAKE THIS SOFTWARE
- AND ASSEMBLED CABLES AVAILABLE TO cOMMODORE 64 ENTHUSIASTS FOR A NOMINAL
- CHARGE; JUST WRITE ME FOR DETAILS. wITH THESE c64 COMPATIBLE PRINTERS
- OFTEN SELLING FOR LESS THAN $25 AT GARAGE SALES AND FLEA MARKETS, IT'S EASY
- TO ADD A COUPLE OF ADDITIONAL "SCRATCH" PRINTERS TO ANY pc SYSTEM.
-
- jOHN kEYERLEBER
- 26300 cHARDONVIEW dRIVE
- cLEVELAND, oh 44143
- (216) 261-9676
- e-MAIL: JKEYERLEBER@BAILEY.COM
-
- lISTING 1:
-
- #INCLUDE <STDIO.H>
- #INCLUDE <CTYPE.H>
- #INCLUDE <DOS.H>
-
- #DEFINE portadr 0X378 // lpt1=0X378, lpt2 = 0X278
- #DEFINE printadr 0X04 // c64 COMPATIBLE PRINTER ADDRESS
- #DEFINE srq 0X01 // c64 srq in SIGNAL
- #DEFINE atn 0X02 // c64 atn SIGNAL
- #DEFINE clk 0X04 // c64 clk SIGNAL
- #DEFINE datout 0X08 // c64 dat SIGNAL (OUTPUT)
- #DEFINE datin 0X80 // c64 dat SIGNAL (INPUT)
- #DEFINE rst 0X10 // c64 rst SIGNAL
-
- // FUNCTION PROTOTYPES
- VOID INITC64(VOID);
- VOID PUTC64(UNSIGNED CHAR);
- VOID PUTS64(CHAR *);
- VOID PUTBYTE(UNSIGNED CHAR, UNSIGNED CHAR);
-
- // FUNCTION MAIN() LOOPS TO READ INPUT CHARACTERS AND SEND THEM TO THE PRINTER
- VOID MAIN(VOID)
- {$7b}
- CHAR BUFF[128], *PTR;
-
- INITC64();
- WHILE(FGETS(BUFF, 80, STDIN))
- {$7b}
- FOR(PTR = BUFF; *PTR; PUTC64(*PTR++));
- {$7d}
- {$7d}
-
- // FUNCTION INIT64() INITIALIZES THE DRIVER AND THE c64 COMPATIBLE PRINTER
- VOID INITC64(VOID)
- {$7b}
- // SET INITIAL PORT OUTPUT VALUE TO ALL BITS HIGH
- OUTPORTB(portadr, rst {$7c} srq {$7c} atn {$7c} clk {$7c} datout);
-
- // SET INTERFACE TO OUTPUT
- OUTPORTB(portadr + 2, 0X00);
-
- // INITIALIZE PRINTER: rst=0, THEN rst=1
- OUTPORTB(portadr, srq {$7c} atn {$7c} clk {$7c} datout);
- DELAY(250);
- OUTPORTB(portadr, rst {$7c} srq {$7c} atn {$7c} clk {$7c} datout);
- DELAY(2250);
-
- // sET PRINTER TO LISTENER: atn AND clk LOW, PRINTER WILL ack WITH dat LOW
- OUTPORTB(portadr, rst {$7c} srq {$7c} datout);
- WHILE(!(INPORTB(portadr + 1) & datin));
-
- // sEND PRINTER ADDRESS (CURRENTLY SET FOR ADDRESS 4)
- PUTBYTE(0X20 {$7c} printadr, 0);
-
- // sEND PRINTER MODE
- PUTBYTE(0X67, 0);
- {$7d}
-
- // FUNCTION PUTC64() SENDS A BYTE OF DATA (BYTEVAL) TO THE c64 COMPATIBLE PRINTER
- VOID PUTC64(UNSIGNED CHAR BYTEVAL)
- {$7b}
- // cHECK FOR UPPER/LOWER CASE CONVERSION
- IF (ISALPHA(BYTEVAL))
- {$7b}
- BYTEVAL = (ISUPPER(BYTEVAL)) ? TOLOWER(BYTEVAL) : TOUPPER(BYTEVAL);
- {$7d}
- // sEND CHARACTER
- PUTBYTE(BYTEVAL, atn);
- {$7d}
-
- // FUNCTION PUTBYTE CLOCKS THE ACTUAL BYTE TO THE c64 COMPATIBLE PRINTER BIT BY BIT
- VOID PUTBYTE(UNSIGNED CHAR BYTEVAL, UNSIGNED CHAR MODE)
- {$7b}
- REGISTER INT BITLOOP;
-
- // sET clk HIGH, PRINTER WILL ack WITH dat HIGH
- OUTPORTB(portadr, rst {$7c} srq {$7c} clk {$7c} datout {$7c} MODE);
- WHILE(INPORTB(portadr + 1) & datin);
-
- // lOOP TO OUTPUT BITS OF DATA
- DELAY(1);
- FOR (BITLOOP=0; BITLOOP<8; BITLOOP++)
- {$7b}
- OUTPORTB(portadr, rst {$7c} srq {$7c} ((BYTEVAL & 1) ? datout : 0) {$7c} MODE);
- DELAY(1);
- OUTPORTB(portadr, rst {$7c} srq {$7c} clk {$7c} ((BYTEVAL & 1) ? datout : 0) {$7c} MODE);
- DELAY(1);
- BYTEVAL >>= 1;
- {$7d}
-
- // sET clk LOW AND dat HIGH FOR END OF BYTE, PRINTER WILL ack WITH dat LOW
- OUTPORTB(portadr, rst {$7c} srq {$7c} datout {$7c} MODE);
- WHILE(!(INPORTB(portadr + 1) & datin));
- {$7d}
-
-
-
-