Jump to content

TI-74 and cassette capabilities


Recommended Posts

There is a Hexbus IC on the board. I was assuming pass through, but maybe it's for something else. I'll have to pull it apart again.


Sent from my moto x4 using Tapatalk

The big IC is a 'line driver' which just means it has higher current outputs for driving a heavier load. I suspect they used it as a buffer and/or inverter for the 3 I/O lines used.


Will this work with the CC40 as well?

Yes, the TI-95 and TI-74 added two pins to make a 10 pin connector. The extra two pins being a 6VDC input to the calculator (which my interface supplies so when you are using the cassette interface you are not running on batteries) and a 6V output. The cable between the adapter and the CC40 would be different. I recently picked up a CC40 and have not used it yet. I'll look at making a cable for it as well. In the design files linked in the video there is a PDF of the schematic (in case you don't use Eagle) which shows the pin outs of the TI-95 connector and adapter connector.


​If there is interest I'll see about getting a small number of PCBs made by OSHpark or someplace so if you want top make on you would just have to buy the components. If there is a really enough interest I might think about putting together 10-20 kits of the PCBs, components and 3d printed case so you can solder it together.

Link to comment
Share on other sites

Doh! Forgot the link





While flipping though your video... I was intrigued by your mentioning the TI-74 cassette interface's ability to sense voltage or current initiated by pressing a button on the player/recorder, causing the remote line to become active. I did not catch what the response is by the TI-74.


I'm curious because I have a particular TI-99/4a which exhibits an interesting response to a particular unused input port on the 9901 being held LOW(Port 10, Pin 29,SBO\SBZ 26), normally held high by a pull-up resistor. While held LOW the system hangs indefinitely and waits for P10 to go high... at any of the times that a prompt for cassette operation would normally appear. It has been speculated that this was in provision for a more automatic type of data drive never implemented by TI. I'm now wondering if this instead was something concieved to work with regular cassette recorders.

Link to comment
Share on other sites

The 'sense' line is an output of the Commodore C2N datasette. It was made use of by the Commodore 64/VIC-20 originally. The TI-95 does not have any provision for this as far as I am aware. Since the CI-7 tape interface was designed for use with a normal cassette deck which would not have had a key sense output.


It is curious though that TI-99/4a has an input pin that acts as though it was made for that purpose given that they had a similar three wire analog tape lead, though they did use a DB9 connector on the computer side of it so there would have been extra pins for that purpose. Maybe they had thought at one point about their own tape deck? Sadly, I don't know much bout the 99/4a.

  • Like 1
Link to comment
Share on other sites

If it's hexbus it's the same just a different pinout


Sent from my LG-H872 using Tapatalk



Nope, the CC-40's processor ROM (2K) doesn't have the cassette routines built in. Someone would have to figure out how to add them by dumping the CC-40+ 4K processor ROM or extracting them from the TI-74's 4K processor ROM.


To be clear, it probably can do it. But not without creating some assembly routines.

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...
  • 1 year later...
  • 2 months later...

Hi, I am Klaus from Germany and this is my first post at atariage. I received a piece of electronics from Italy on ebay, the function of which I would like to find out. It is a CI-7 interface but with a Centronics male plug like this on the pictures from gferluga above. 

I suspect it only works with specially written access functions, which I unfortunately don't have. I have measured all connections between the 5 IC's and the two connectors. This resulted in two circuit diagrams: the first shows the 5 ICs and in the second they are broken down into individual logic gates. I am now also sure that the circuit is used to connect an old parallel printer to the TI-74: "INTERFACE CENTRONICS" is on the back of the board. The Italian insurance company VitaNuova had equipped its representatives with a case that contained a "KODAK DICONIX 180si" printer with a Centronics interface in addition to the TI-74S. This interface comes from such a case. Unfortunately I don't have a VitaNuova ROM cartridge and have to figure out how to control it to send characters to the printer. I don't think this can be done without an assembler routine, with which the output lines of the TI-74 are written and read directly past the usual protocol. 

I find it remarkable that the 74HC164 receives its supply voltage via the output of an AND gate, i.e. it can be switched off and on. The connection between the BUSY output of the printer and its STROBE input via two inverters is completely incomprehensible but measured three times. How can STROBE ever get high like this? There are a lot of puzzles in this little circuit ... 

both side.jpg




Edited by KlausO
  • Like 5
Link to comment
Share on other sites

  • 3 weeks later...

I hadn't ever seen a parallel version of the interface in the wild. Have you tried to connect it to any other Centronics printers? Most of them used identical signalling (there were sometimes minor differences, but most of them fit into one or two broadly compatible groups). Then you can just try to print and see what happens. . .

Link to comment
Share on other sites

Thanks for the hint Ksarul. The Kodak DICONIX 180 SI Centronic Printer works very well on other computers. So the printer is fine. An attempt with the TI-74 to print something via this interface with LIST "12" only leads to the usual error message E0 I/O error 255 "12". I ask the developer of the TIIF2 program and he answer: "It certainly won't work with open, print, close, because these commands expect a strict protocol. You need a bit of intelligence that can't possibly be found in the few TTLs. With the PC interface, this part is on the PC side. This means that the printer would have to do that what is extremely unlikely. Then it would be a custom-made product."


I tried different POKE-commands at addresses 274, 275 and 276 without success. The idea for this comes from the "cc40 ti74 hexbus.txt" file from //ftp.whtech.com/hexbus_cc40_ti74/. There is a section entitled "CC-40 PROJECT REPORT # 5", which shows how you can set and read HEX-BUS pins directly. The TI-74 does not seem to have the same addresses for the DOCK-BUS. 

Does anyone know this addresses for the TI-74?

Link to comment
Share on other sites

Have you asked Mr. Ferluga what commands he was using to try and print? He noted that his Centronics interface works. . .it could be something as simple as LIST "PIO". Centronics interfaces are basically dumb. They have parallel data lines and a few control lines to manage data flow and that's it. The printer takes the input characters and processes them (prints printable characters and executes control characters). When printing graphics, the printer switches to graphics mode based on the control code and goes from there. If the software sending the data doesn't use the right codes, data ends up looking like garbage in the printout, but that's about all that can happen.

Link to comment
Share on other sites

Good advice, I asked Mr. Ferluga about it yesterday and got a direct answer. However, he has not tried the interface himself, but will soon do it. I stick to my assessment that it used to only work with an insurance company cartridge because it was specifically controlled by the insurance software. The standard functions of the TI-74 do not work with this interface.


I got further when looking for the DOCK-BUS addresses of the TI-74. I connected an LED between 5V and a transistor-collector on a breadboard. From the transistor-emitter a 330 Ohm resistor goes to GND. At the base of the transistor came a 10 kOhm resistor with a cable to the DOCK-BUS of the TI-74. So I could see directly what a poke does. The DOCK-BUS data-lines D0 to D3 are controlled via address 270. The handshake lines BAV and HSK via address 271. To be able to output something via D0 to D3, BAV must first be set to high and HSK to low. The following two lines set D0 to D3 high: 
CALL POKE (271,1)
CALL POKE (270,15)

The logic for address 271 looks like this:
value    BAV    HSK
   3        L         L
   2        L         H
   1        H         L
   0        H         H

With this knowledge, I can now plug in the interface and try to send something to the printer. Hopefully at first only readable and no control codes ...

Link to comment
Share on other sites

Characters are output to the printer with this interface by first collecting 8 individual bits in the 74HC164 and then signaling to the printer via a low pulse at Strobe that the printer can accept the byte = character. For pure output, address 271 must be set to 1 (BAV=high, HSK=low). The data line is used as follows: 
D0: The bit to be output in inverted form 
D1 = 0 
D2: The change from low to high pushes the bits in the 74HC164 one place further. 
D3 = 0 

This small program continuously writes bits into the 74HC164. It starts with a high bit followed by a low bit and so on. I used it to switch LEDs from the interface on and off. So even without a printer I could see whether the interface works this way.
   80 CALL POKE(271,2)
   90 CALL POKE(271,1)
  100 A=270
  110 B=0:CALL POKE(A,B)
  120 PRINT A,B
  130 B=4:CALL POKE(A,B)
  140 PRINT A,B
  210 B=1:CALL POKE(A,B)
  220 PRINT A,B
  230 B=5:CALL POKE(A,B)
  240 PRINT A,B
  250 GOTO 100


Now the first real program for the Interface. It send 7 characters to the printer: The five readable characters TI-74 as well as carriage return and line feed.  It takes a little over 4 seconds. The two lines 470 and 480 generate the low pulse on strobe. The program works without any problem but it is to slow. 


300 CALL POKE(271,2)
  310 CALL POKE(271,1)
  312 A=270
  320 Z=ASC("T"):GOSUB 400
  330 Z=ASC("I"):GOSUB 400
  340 Z=ASC("-"):GOSUB 400
  350 Z=ASC("7"):GOSUB 400
  360 Z=ASC("4"):GOSUB 400
  370 Z=13:GOSUB 400
  375 Z=10:GOSUB 400
  390 END
  400 FOR I=1 TO 8
  410 T=Z-128
  420 IF T<0 THEN B=1:Z=2*Z
  430 IF T>=0 THEN B=0:Z=2*T
  440 CALL POKE(A,B)
  450 CALL POKE(A,B+4)
  460 NEXT I
  470 CALL POKE(A,2)
  480 CALL POKE(A,0)
  490 RETURN


I am planning a version that prints the contents of the TI-74's display. I would then like to implement this in machine language and also take into account the two signals ACK and Busy output by the printer.

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

This is the BASIC-Version of the program that print the ontent of the TI-74's display with the "INTERFACE CENTRONICS". The dsiplay-buffer start at adress 8333 with the firts character and go down to 8254. The first task is to search from the end after the first character that is not a space (=32). This is the last character in the line to print. Then tranfers the characters one by one from the start of the display-buffer to the last character. At the end of the line send a CR (=13) and a LF (=10) to the printer. The Runtime of the BASIC-Version is 70 seconds for the two example-Lines. The Line 510 is a REM because BASIC ist to slow to catch the ACK-Signal from the printer. In Line 470 the TROBE-Signal goes low and the real Printer answer with ACK low in a very short time, before BASIC has reached Line 480. The poke in line 480 set STROBE high and clear the 74HC74. In this moment the ACK from the printer is lost and can not be found in line 510. In the Assembler-version the logic works and it wait for the ACK from the printer.


   10 PRINT "The quick brown fox jumps over a lazy dog."
   20 GOSUB 300
   30 PRINT "EXP(PI*SQR(163)) = EXP(";PI;"*";SQR(163);"))=";EXP(PI*SQR(163))
   40 GOSUB 300
   50 END
  300 CALL POKE(271,1)
  310 A=270
  320 CALL POKE(A,13)
  330 CALL PEEK(A,B)
  340 IF B<12 THEN 330
  350 FOR E=8254 TO 8333
  355 CALL PEEK(E,B):IF B<>32 THEN 370
  360 NEXT E
  370 FOR S=8333 TO E STEP -1
  375 CALL PEEK(S,Z):GOSUB 400
  380 NEXT S
  385 Z=13:GOSUB 400
  390 Z=10:GOSUB 400
  395 RETURN
  400 FOR I=1 TO 8
  410 T=Z-128
  420 IF T<0 THEN B=1:Z=2*Z
  430 IF T>=0 THEN B=0:Z=2*T
  440 CALL POKE(A,B)
  450 CALL POKE(A,B+4)
  460 NEXT I
  470 CALL POKE(A,6)
  480 CALL POKE(A,4)
  490 CALL POKE(A,13)
  500 CALL PEEK(A,B)
  510 REM IF B<>12 THEN 500
  520 RETURN




Edited by KlausO
  • Like 2
Link to comment
Share on other sites

This is the assembler version of the BASIC program from the last post. It works exactly the same, but instead of 70 seconds it only takes 3.5 seconds for the two example lines. The attached file PRTDSP_v4c.txt contains the source code of the assembler routine. The first columns with the HEX values were determined with the aid of the program asm7.exe under Windows XP. I then converted the two-digit hex values into decimal numbers and transferred them to the following BASIC program. The jump destination of the "CALL @PRT" command must be set afterwards because this absolute address is only fixed when memory has been requested with GETMEM. All other jumps (JP, JNE, JPZ, JNZ) in the assembler program using relative addresses, i.e. jump x bytes forwards or backwards and are independent of where the assembler routine is in the memory.


  100 CALL GETMEM(120,ASM)
  110 CALL POKE(ASM,136,32,62,118,34,1,139,1,15,34)
  120 CALL POKE(ASM+10,13,139,1,14,34,12,141,1,14,228)
  130 CALL POKE(ASM+20,249,34,32,157,118,230,8,211,118,34)
  140 CALL POKE(ASM+30,141,29,118,230,242,50,118,136,32,141)
  150 CALL POKE(ASM+40,118,154,118,208,120,142,(ASM+68)/256,(ASM+68),219,118)
  160 CALL POKE(ASM+50,77,1,118,229,242,114,13,120,142,(ASM+68)/256)
  170 CALL POKE(ASM+60,(ASM+68),114,10,120,142,(ASM+68)/256,(ASM+68),10,114,8)
  180 CALL POKE(ASM+70,121,181,223,120,227,1,179,139,1,14)
  190 CALL POKE(ASM+80,40,4,139,1,14,210,121,230,238,34)
  200 CALL POKE(ASM+90,6,139,1,14,34,4,139,1,14,34)
  210 CALL POKE(ASM+100,13,139,1,14,34,12,141,1,14,230)
  220 CALL POKE(ASM+110,249,10)
  230 PRINT "The quick brown fox jumps over a lazy dog."
  250 PRINT "EXP(PI*SQR(163)) = EXP(";PI;"*";SQR(163);"))=";EXP(PI*SQR(163))


Link to comment
Share on other sites

  • 2 months later...

Hi Jeff,


Amazing work on creating the interface!! Couple of questions:

1) For those of us with only a regular cassette tape recorder, would that work on, let´s say, manual mode?

2) I recently read about a TI Connectivity USB cable for their latest Graph Calculators (TI-73, TI-83, TI-83 Plus, etc). Do you think there could be a chance for adapting one of those to the TI-74, 95?




Link to comment
Share on other sites

  • 1 year later...

For all of you, I connected my TI-74 to my computer to save the basic programs and to load new ones. I used the https://petlibrary.tripod.com/cassette.html to create a cassette device or using the Arduino Leonardo (https://github.com/molleraj/ti95interface). I have created a Python sofware to to manage the full process, take a look at https://github.com/rinxo/TI74-Manager.


  • Like 2
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...