-
Content Count
1,020 -
Joined
-
Last visited
-
Days Won
1
Posts posted by Stuart
-
-
This is a little project to implement an IDE interface through a TMS 9901 programmable systems interface IC, with the software to read and write to the IDE drive written in Cortex BASIC. At the moment there is no file system as such, it only reads and writes directly to sectors on the drive, so it is perhaps a solution looking for a problem - a pseudo-vintage data logger perhaps!
The design is based around my TMS 9900 PCB System (www.stuartconner.me.uk/tms9900_breadboard/tms9900_breadboard.htm) where the programmable pins on the 9901 can be easily accessed through two header connectors. The circuit diagram is shown below.
On the PCB, some of the 9901 pins are connected to pull-up resistors and some to pull-down resistors. When the 9901 is reset, all the pins are programmed as inputs, so their default logic state is determined by the pull-up/down resistors. When deciding how to connect the IDE interface, it is important that the active low control signals /RESET, /CS0, /READ and /WRITE are connected to pins on the 9901 that default to a high logic level such that the IDE drive defaults to an 'inactive' state. The eight data lines are connected to pins accessed through sequential CRU bits in the 9901 such that they can be set and read using multi-bit CRU instructions.
The project is primarily focussed on Compact Flash IDE drives which can be set to operate in an 8-bit mode - two 8-bit read/write operations take place for each 16-bit data transfer. Although the hardware is also compatible with hard drives, they do not support the 8-bit mode, which wastes half the data in each 512-byte sector. The 8-bit mode feature is selected on a Compact Flash drive by writing >01 to the Feature register (register 1) then the >EF 'Set Feature' command to the Command register (register 7).
As stated previously, when the 9901 is reset, all the pins are programmed as inputs. Writing to a pin programs it as an output, and it remains as an output until the 9901 is reset - either a hardware reset, or a software reset triggered by writing to a specific CRU bit. Therefore when reading a sector from the drive, the various registers on the drive are first programmed (by selecting a register on the 3-bit address bus then writing a value on the data bus), then the 9901 has to undergo a software reset such that the data bus pins can then be used as inputs to read the data from the sector selected on the drive.
The software does not do any 'drive busy' checks on the drive before performing operations. The couple of CF cards I have tried seem to have no problems keeping up with an elderly 3 MHz processor running a BASIC interpreter! Likewise there is no error detection - if it works it works, it if doesn't it doesn't!
The Cortex BASIC software listing is shown below, along with an example 'session' writing data from memory to a sector and reading the data back again. The program provides feedback on how the IDE drive registers are being programmed for each operation.
100 REM TMS 9901 TO IDE INTERFACE 110 REM BY STUART CONNER, OCTOBER 2017 120 REM CORTEX BASIC 130 REM 140 REM ********************** 150 REM *** INITIALISE CRU *** 160 REM ********************** 170 BASE 040H+(2*18) !SET BASE ADDRESS TO CRU BIT 18 OF 9901 180 REM 190 REM ******************** 200 REM *** DISPLAY MENU *** 210 REM ******************** 220 PRINT "SELECT FROM THE FOLLOWING OPTIONS:" 230 PRINT "(1) WRITE A SECTOR WITH A SPECIFIED BYTE" 240 PRINT "(2) WRITE A SECTOR WITH DATA FROM MEMORY" 250 PRINT "(3) READ AND DISPLAY A SECTOR" 260 PRINT "(9) QUIT" 270 INPUT "OPTION",CH 280 IF CH=1 OR CH=2 THEN GOTO 360 290 IF CH=3 THEN GOTO 670 300 IF CH=9 THEN END 310 GOTO 270 320 REM 330 REM ******************** 340 REM *** WRITE SECTOR *** 350 REM ******************** 360 INPUT "SECTOR ADDRESS",SA 370 IF CH=1 THEN INPUT "BYTE TO WRITE",BYT 380 IF CH=2 THEN INPUT "MEMORY ADDRESS TO START WRITING FROM",ADS 390 GOSUB 1080 !RESET 9901 400 GOSUB 1000 !RESET IDE DRIVE 410 GOSUB 1470 !SET /CS0 LOW 420 GOSUB 1660 !SELECT MASTER DRIVE 430 GOSUB 1750 !SET 8-BIT MODE 440 NS=1: GOSUB 1870 !SET NUM OF SECTORS TO TRANSFER 450 GOSUB 1960 !SET SECTOR ADDRESS 460 REG=7: GOSUB 1160 !SELECT REGISTER 7 TO WRITE COMMAND 470 DAT=030H: GOSUB 1590 !SET DATA BUS FOR WRITE SECTOR COMMAND 480 GOSUB 1280 !PULSE /WRITE LOW 490 REG=0: GOSUB 1160 !SELECT REGISTER 0 TO WRITE DATA 500 PRINT "WRITING SECTOR:" 510 FOR I=1 TO 512/16 520 FOR J=1 TO 16 530 IF CH=1 THEN CRF[8]=BYT 540 IF CH=2 THEN CRF[8]=MEM[ADS]: ADS=ADS+1 550 GOSUB 1280 !PULSE /WRITE LOW 560 NEXT J 570 PRINT "."; 580 NEXT I 590 PRINT 600 GOSUB 1530 !SET /CS0 HIGH 610 PRINT 620 GOTO 220 630 REM 640 REM ******************* 650 REM *** READ SECTOR *** 660 REM ******************* 670 INPUT "SECTOR ADDRESS",SA 680 GOSUB 1080 !RESET 9901 690 GOSUB 1000 !RESET IDE DRIVE 700 GOSUB 1470 !SET /CS0 LOW 710 GOSUB 1660 !SELECT MASTER DRIVE 720 GOSUB 1750 !SET 8-BIT MODE 730 NS=1: GOSUB 1870 !SET NUM OF SECTORS TO TRANSFER 740 GOSUB 1960 !SET SECTOR ADDRESS 750 REG=7: GOSUB 1160 !SELECT REGISTER 7 TO WRITE COMMAND 760 DAT=020H: GOSUB 1590 !SET DATA BUS FOR READ SECTOR COMMAND 770 GOSUB 1280 !PULSE /WRITE LOW 780 GOSUB 1530 !SET /CS0 HIGH 790 GOSUB 1080 !RESET 9901 TO CHANGE DATA BUS TO INPUT 800 GOSUB 1470 !SET /CS0 LOW AGAIN 810 REG=0: GOSUB 1160 !SELECT REGISTER 0 TO READ DATA 820 PRINT "READING SECTOR (ALL VALUES IN HEX):" 830 FOR I=1 TO 512/16 840 FOR J=1 TO 16 850 GOSUB 1350 !SET /READ LOW 860 BYT=CRF[8] 870 GOSUB 1410 !SET /READ HIGH 880 PRINT #;BYT;" "; 890 NEXT J 900 PRINT 910 NEXT I 920 PRINT 930 GOSUB 1530 !SET /CS0 HIGH 940 PRINT 950 GOTO 220 960 REM 970 REM *********************** 980 REM *** RESET IDE DRIVE *** 990 REM *********************** 1000 PRINT "RESETTING IDE DRIVE" 1010 CRB[8]=0 !CRU BIT 26 (P0) 1020 CRB[8]=1 1030 RETURN 1040 REM 1050 REM ****************** 1060 REM *** RESET 9901 *** 1070 REM ****************** 1080 PRINT "RESETTING TMS 9901" 1090 CRB[-18]=1 !CRU BIT 0 (SET CLOCK MODE) 1100 CRB[-3]=0 !CRU BIT 15 (/RST2) 1110 RETURN 1120 REM 1130 REM *********************************** 1140 REM *** WRITE REGISTER NUMBER (0-7) *** 1150 REM *********************************** 1160 PRINT "ADDRESSING REGISTER";REG 1170 IF REG>=4 THEN CRB[10]=1: REG=REG-4 !CRU BIT 28 (P12) 1180 ELSE CRB[10]=0 1190 IF REG>=2 THEN CRB[9]=1: REG=REG-2 !CRU BIT 27 (P11) 1200 ELSE CRB[9]=0 1210 IF REG=1 THEN CRB[-2]=1 !CRU BIT 16 (P0) 1220 ELSE CRB[-2]=0 1230 RETURN 1240 REM 1250 REM ************************ 1260 REM *** PULSE /WRITE LOW *** 1270 REM ************************ 1280 CRB[12]=0 !CRU BIT 30 (P14) 1290 CRB[12]=1 1300 RETURN 1310 REM 1320 REM ********************* 1330 REM *** SET /READ LOW *** 1340 REM ********************* 1350 CRB[13]=0 !CRU BIT 31 (P15) 1360 RETURN 1370 REM 1380 REM ********************** 1390 REM *** SET /READ HIGH *** 1400 REM ********************** 1410 CRB[13]=1 !CRU BIT 31 (P15) 1420 RETURN 1430 REM 1440 REM ******************** 1450 REM *** SET /CS0 LOW *** 1460 REM ******************** 1470 CRB[11]=0 !CRU BIT 29 (P13) 1480 RETURN 1490 REM 1500 REM ********************* 1510 REM *** SET /CS0 HIGH *** 1520 REM ********************* 1530 CRB[11]=1 !CRU BIT 29 (P13) 1540 RETURN 1550 REM 1560 REM ******************** 1570 REM *** SET DATA BUS *** 1580 REM ******************** 1590 PRINT "SETTING DATA BUS TO";DAT;" (";#;DAT;"H)" 1600 CRF[8]=DAT 1610 RETURN 1620 REM 1630 REM *************************** 1640 REM *** SELECT MASTER DRIVE *** 1650 REM *************************** 1660 PRINT "SELECTING MASTER DRIVE (REG 6 AND DATA)" 1670 REG=6: GOSUB 1160 !SELECT REGISTER 6 1680 DAT=0E0H: GOSUB 1590 !SET DATA BUS 1690 GOSUB 1280 !PULSE /WRITE LOW 1700 RETURN 1710 REM 1720 REM ********************** 1730 REM *** SET 8-BIT MODE *** 1740 REM ********************** 1750 PRINT "SELECTING 8-BIT MODE (REG 1 AND DATA, REG 7 AND DATA)" 1760 REG=1: GOSUB 1160 !SELECT REGISTER 1 TO SET FEATURE 1770 DAT=01H: GOSUB 1590 !SET DATA BUS 1780 GOSUB 1280 !PULSE /WRITE LOW 1790 REG=7: GOSUB 1160 !SELECT REGISTER 7 TO WRITE COMMAND 1800 DAT=0EFH: GOSUB 1590 !SET DATA BUS 1810 GOSUB 1280 !PULSE /WRITE LOW 1820 RETURN 1830 REM 1840 REM ***************************************** 1850 REM *** SET NUMBER OF SECTORS TO TRANSFER *** 1860 REM ***************************************** 1870 PRINT "SETTING NUMBER OF SECTORS TO TRANSFER TO";NS;" (REG 2 AND DATA)" 1880 REG=2: GOSUB 1160 !WRITE NUM OF SECTORS TO TRANSFER TO REGISTER 2 1890 DAT=NS: GOSUB 1590 !SET DATA BUS 1900 GOSUB 1280 !PULSE /WRITE LOW 1910 RETURN 1920 REM 1930 REM ********************************************* 1940 REM *** SET SECTOR (LBA) ADDRESS (0 TO 32767) *** 1950 REM ********************************************* 1960 PRINT "SETTING SECTOR ADDRESS TO";SA;" (REG 3 AND DATA, REG 4 AND DATA, REG 5 AND DATA)" 1970 REG=3: GOSUB 1160 !WRITE SECTOR ADDRESS LBA 0 TO REGISTER 3 1980 DAT=SA LAND 0FFH: GOSUB 1590 !SET DATA BUS 1990 GOSUB 1280 !PULSE /WRITE LOW 2000 REG=4: GOSUB 1160 !WRITE SECTOR ADDRESS LBA 1 TO REGISTER 4 2010 DAT=SA/256 LAND 0FFH: GOSUB 1590 !SET DATA BUS 2020 GOSUB 1280 !PULSE /WRITE LOW 2030 REG=5: GOSUB 1160 !WRITE SECTOR ADDRESS LBA 2 TO REGISTER 5 2040 DAT=0H: GOSUB 1590 !SET DATA BUS 2050 GOSUB 1280 !PULSE /WRITE LOW 2060 RETURNExample:
SELECT FROM THE FOLLOWING OPTIONS: (1) WRITE A SECTOR WITH A SPECIFIED BYTE (2) WRITE A SECTOR WITH DATA FROM MEMORY (3) READ AND DISPLAY A SECTOR (9) QUIT OPTION? 2 SECTOR ADDRESS? 10 MEMORY ADDRESS TO START WRITING FROM? 0 RESETTING TMS 9901 RESETTING IDE DRIVE SELECTING MASTER DRIVE (REG 6 AND DATA) ADDRESSING REGISTER 6 SETTING DATA BUS TO 224 (E0H) SELECTING 8-BIT MODE (REG 1 AND DATA, REG 7 AND DATA) ADDRESSING REGISTER 1 SETTING DATA BUS TO 1 (01H) ADDRESSING REGISTER 7 SETTING DATA BUS TO 239 (EFH) SETTING NUMBER OF SECTORS TO TRANSFER TO 1 (REG 2 AND DATA) ADDRESSING REGISTER 2 SETTING DATA BUS TO 1 (01H) SETTING SECTOR ADDRESS TO 10 (REG 3 AND DATA, REG 4 AND DATA, REG 5 AND DATA) ADDRESSING REGISTER 3 SETTING DATA BUS TO 10 (0AH) ADDRESSING REGISTER 4 SETTING DATA BUS TO 0 (00H) ADDRESSING REGISTER 5 SETTING DATA BUS TO 0 (00H) ADDRESSING REGISTER 7 SETTING DATA BUS TO 48 (30H) ADDRESSING REGISTER 0 WRITING SECTOR: ................................ SELECT FROM THE FOLLOWING OPTIONS: (1) WRITE A SECTOR WITH A SPECIFIED BYTE (2) WRITE A SECTOR WITH DATA FROM MEMORY (3) READ AND DISPLAY A SECTOR (9) QUIT OPTION? 3 SECTOR ADDRESS? 10 RESETTING TMS 9901 RESETTING IDE DRIVE SELECTING MASTER DRIVE (REG 6 AND DATA) ADDRESSING REGISTER 6 SETTING DATA BUS TO 224 (E0H) SELECTING 8-BIT MODE (REG 1 AND DATA, REG 7 AND DATA) ADDRESSING REGISTER 1 SETTING DATA BUS TO 1 (01H) ADDRESSING REGISTER 7 SETTING DATA BUS TO 239 (EFH) SETTING NUMBER OF SECTORS TO TRANSFER TO 1 (REG 2 AND DATA) ADDRESSING REGISTER 2 SETTING DATA BUS TO 1 (01H) SETTING SECTOR ADDRESS TO 10 (REG 3 AND DATA, REG 4 AND DATA, REG 5 AND DATA) ADDRESSING REGISTER 3 SETTING DATA BUS TO 10 (0AH) ADDRESSING REGISTER 4 SETTING DATA BUS TO 0 (00H) ADDRESSING REGISTER 5 SETTING DATA BUS TO 0 (00H) ADDRESSING REGISTER 7 SETTING DATA BUS TO 32 (20H) RESETTING TMS 9901 ADDRESSING REGISTER 0 READING SECTOR (ALL VALUES IN HEX): FF B0 01 38 80 40 80 00 80 40 80 04 80 40 80 08 80 40 80 0C 80 60 80 10 80 60 80 14 80 60 80 18 80 60 80 1C 80 80 80 20 80 80 80 24 80 80 80 28 80 80 80 2C 80 A0 80 30 80 A0 80 34 80 A0 80 38 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF D4 05 C4 FF D4 05 62 FF D4 05 CE FF BA 04 F6 FF C6 01 BC FF C6 01 A0 FF D4 04 FC FF B0 06 10 02 E0 FF B0 04 C1 02 02 FF FC CC B1 02 01 05 FA CC 81 02 09 00 80 02 0C 00 00 C8 0C FF DE 2F A0 01 E1 04 C0 04 C3 02 08 00 01 2E C5 2F A0 01 DA 06 A0 00 EA 42 01 06 04 43 03 06 2E 45 00 05 F8 46 07 08 9E 48 03 08 CE 4C 00 07 20 4D 03 05 04 4E 03 08 E8 4F 00 09 96 52 00 06 E8 57 01 06 7A 3F 00 08 E2 00 00 02 2B 00 03 C2 9B 13 1F 91 7B 16 FA D1 BB C2 DB 09 86 02 07 FF B0 09 16 17 0D 2E 44 01 12 01 26 CD C4 05 83 02 85 0D 00 13 05 10 F5 05 C7 02 85 0D 00 16 F7 04 5B 04 C0 10 08 02 00 00 01 10 05 02 00 00 02 10 02 02 00 00 04 2F A0 01 CE 2E 00 10 A4 02 0C FF F4 04 FC 07 3C 04 FC 04 DC 02 0C 00 00 C8 0C FF DE 1D 1F 32 20 02 5F 1E 0D 04 C3 02 07 01 7C 10 0B 1F 0F 13 FE 05 83 1F 0F 16 FD 02 07 01 7A 8D C3 12 02 05 C7 10 FC 33 17 04 60 0A 50 10 83 00 07 00 1A 00 0E 00 34 00 1D 00 68 00 3B 00 D0 00 75 01 A0 00 EA 03 40 02 46 04 D0 7F FF 06 38 61 00 7A 00 E0 00 1F 15 16 FE 04 DB 36 1B 1E 12 88 1B 01 9A 1A 05 88 1B 01 9C 1B 02 A6 E0 01 9E 03 80 1D 10 1F 16 16 FE 32 1B 1F 16 16 FE 1F 17 16 FC 03 80 0D 0A 45 52 52 4F 52 20 00 20 20 20 20 00 0D 0A 42 50 00 0D 0A 3F 3E 00 0D 0A 54 49 42 55 47 20 52 45 56 2E 42 20 28 63 6F 6D 6D 73 20 31 39 32 30 30 SELECT FROM THE FOLLOWING OPTIONS: (1) WRITE A SECTOR WITH A SPECIFIED BYTE (2) WRITE A SECTOR WITH DATA FROM MEMORY (3) READ AND DISPLAY A SECTOR (9) QUIT OPTION?
-
11
-
-
I suspect that for the CF cards that don't work on the TI, the problem is an electrical or timing incompatibility, and no amount of re-re-reformatting on a PC is going to sort that.
-
The add-in board is replacing the original WD1771 floppy controller with a WD1773?
-
OK, next Questions -
0.36Ohm with 32W dissipation. <--- how do I translate that in to a physical purchase?
SOURCE:[/size]http://www.amibay.com/showthread.php?16135-A4000D-Amigakit-ATX-PSU-adapter
There are various designs of ATX power supply and some need a minimal load and others don't (or need a minimal load on a different rail). I'd be inclined to connect it up and measure the voltages and see if they're OK and your board works - your board may provide the minimal load required. If you need a bit of load on the +5V and +12V rails, connecting an old hard drive and just let it sit there spinning away should work.
-
1
-
-
A momentary switch would be better if you are just wanting to trigger the psu to turn on/off. Yellow wire on ATX is +12vdc to run your LED. Green wire touched for a second or so to a black ground wire will trigger the power to come on. Please forgive if you know this already

I think this may vary by PSU (or possibly by circuitry on the motherboard). For the ATX PSUs that I've tinkered with it will come on when you touch green to black and then turn off as soon as you disconnect green from black.
-
1
-
-
If the Youtube video didn't answer, there are wiring details as the last photo on the Amazon page you link to.
C = Common
NO = Normally Open. This connects to C when you push the button.
NC = Normally Closed. This is normally connected to C, and disconnects when you press the button.
LED = +12V supply for LED.
A = GND connection for LED.
If you're trying to power up an ATX PSU, you need to connect the green wire on the PSU connector to any of the black wires. So green (/PS_ON) to switch NO and black (COM) to switch C. Assuming you want to light the LED when the PSU is on, you then need yellow (+12V) to switch LED and black (COM) again to switch A.
-
1
-
-
Could the LOAD line be confiscated and used to create a proper RS232 interrupt?
What I mean by proper is used for RS232 only, so as to reduce the size and complexity of the ISR allowing faster communication and lower overhead on the main program.
It would require running a connection from the RS232 card. I have not looked at the drawings to see if there are any open pins on the Expansion box buss. And based on Tursi's response on multiple triggers it might want some conditioning logic added to the RS232 board.
I kind of salivate knowing there is an available interrupt vector in RAM.

You'll have to continue salivating, Bill. The /LOAD signal is present on the console edge connector but isn't routed down the flex cable to the PEB.
-
Best video mod is to fit an F18A to give a VGA output as Greg said above. But if you wanted to stay 'old school' and you have the version of the PAL modulator in a metal case (as opposed to the one in the plastic case), it is possible to get a composite video feed out of it. The attached scan (in German) shows you the basics but you will probably have to do a bit of fiddling to find the right connection points and so on. Instead of fitting a DIN connector as shown, I fed a coaxial cable direct into the case and connected it direct to output of the little video amplifier circuit.
-
1
-
-
# Coexistence
Now, I have no idea how the Nanopeb/cf7 works. I don't own one. Does it use CRU base 0x1000 for anything? Does it use 0x1300 for RS232, 0x1100 for DSK? And another for image management?
Pretty sure I tested the CRU base addresses years ago and they were the same as the equivalent PEB cards.
-
1
-
-
Have you got a Horizon Ramdisk? That apparently has a hook for a user interrupt service routine, so you could possibly trigger interrupts through the joystick port and TMS 9901, and that will trigger the console ISR to run each PEB card ISR in turn to find the source. A hook into the Ramdisk ISR could check the TMS 9901 interrupt pins to see if one of your interrupts occurred. I don't fully understand how the Ramdisk card ISR works (the Ramdisk code is on Thiery's site) but it would be simple to modify the Ramdisk code to point directly to your ISR (at a known location in memory) and reload the Ramdisk code.
-
Hi. I'm looking at triggering interrupts upon the status of certain pins on the parallel port, something similar to pin interrupts on the Arduino or the Raspberry Pi. Is the TI capable of doing this? The E/A manual is very sketchy on the use of interrupts, but it does mention INT1 as an external interrupt for the 9901. Not sure how to use that info or whether it would even help me in the current situation...
You can't trigger anything direct from a pin on the parallel port because there is no connection from the parallel port to the interrupt circuitry. You can *poll* the parallel port for pin status but that's not what you're asking.
/INT1 is an interrupt generated by one of the PEB cards, and I don't think there is any way you can usefully use that for what you're thinking of (unless you design your own PEB card).You've got access to some of the interrupt pins on the TMS 9901 (/INT3 - /INT7) through the joystick interface, and you could use one of these to trigger an interrupt. You have the problem though of the processor interrupt code being hard-wired and so the processor only calls the interrupt service routine in the console ROM. It might be possible to hook into the user-defined interrupt service routine called from the VDP interrupt routine and use that to interrogate the interrupt pins on the TMS 9901, but then you might as well just directly interrogate the pins on the parallel port. Trying to use these pins on the joystick port in this way will also preclude use of the keyboard while you have anything connected to the joystick port.
If you're interested in experimenting, I've got some more of my TMS 9900 system PCBs on order and that gives you easy access to all the interrupt pins on the TMS 9901 and all the interrupt vectors. You can program the TMS 9901 either from Cortex BASIC or assembler. A little example program below. In this case the interrupt vector for /INT2 (the interrupt vectors are stored in the low area of ROM) is >8004 (which is in RAM in this system). The code places at >8004 a jump to the code at address MESSG. Each time an /INT2 interrupt occurs (just use a bit of wire to short the /INT2 pin on a header connector to ground) the code at address MESSG is run to print a message over the serial port.
*The following block of code has to be run by the user to initialise the interrupt routine. AORG >80C0 Load code after the interrupt /INT2 entry point and workspace. LWPI MYWS Load workspace. *Store a branch instruction at the /INT2 code entry point to branch to the code to print a message. LI R1,>0460 Op-code for Branch instruction. MOV R1,@>8004 LI R1,MESSG MOV R1,@>8006 *Enable /INT2 interrupts on the TMS 9901 and TMS 9900. LI R12,>0040 CRU base address for the TMS 9901. SBZ 0 Set Control bit to 0 to select interrupt mode. SBO 2 Enable (unmask) /INT2 interrupt. LIMI 2 Enable processor interrupt levels 0, 1 and 2. *Return to TIBUG. B @>0080 Quit back to TIBUG. *The following block of code is called each time an /INT2 interrupt occurs. *Code to print message. MESSG EQU $ MOV R11,@SAVR11 Save R11. CLR R12 CRU base address for the TMS 9902. LI R1,MSGTXT Set pointer to text message. BL @PMESSG Print message. *** XOP @MSGTXT,14 Print message text. *** CAN'T USE AN XOP IN THE INTERRUPT ROUTINE. MOV @SAVR11,R11 Restore R11. LI R0,>8000 Timing loop to debounce the switch contact. DBLOOP DEC R0 JNE DBLOOP RTWP Return to calling routine. *Print message subroutine. PMESSG MOVB *R1+,R2 Copy character from text message and increment pointer. JEQ EXIT If character is >00 then exit. SBO 16 Set /RTS on. WENTRY1 TB 22 Transmit buffer register empty? JNE WENTRY1 No, loop until it is. LDCR R2,8 Send character. WLOOP1 TB 22 Transmit buffer register empty? JNE WLOOP1 No, loop until it is. JMP PMESSG Process next character in message. EXIT B *R11 Return. *Workspace and data. MYWS BSS 32 Workspace. SAVR11 DATA 0 MSGTXT BYTE >0D,>0A TEXT 'An /INT2 interrupt has occurred.' BYTE >0D,>0A BYTE >00 END -
If you don't want it, I'll gladly send you a plastic 9900, to take it's place, exchange.
Note though that it is soldered in, and would be a right pain to remove. White ceramic 9900's come up fairly cheap on eBay occasionally if you really want one. There are some rather fetching purple ceramic ones as well.
-
I also found a TI-99 modified Console by TI-Workshop Wiesbaden 32 K Memory
this show me
@1981 PEXAS INSTRUIEJTS
That shows that one or more of your video RAM chips are bad.
-
2
-
-
Well it looks like this TI99 may become a sacrifice machine to practice soldering on then. Not really interested in putting a lot of money into it since it was something I got cheap. I may try to sell off the accessories and carts and using that money for something else. Thanks for your help everyone.
ISTR someone else had the same problem fairly recently and one of the 6810 RAMs was faulty and had to be replaced. I don't think it will be VDP or VRAM (although you *may* find a video problem as well once you get a picture). The machine isn't silencing the sound chip, and it does that pretty early in the boot sequence. Worth checking the power supply voltages as well - should be +5V, +12V, -5V.
So for your soldering practise you might want to cut out the 6810 RAMs and replace - they're pretty cheap on eBay.

The 'silver bar' heatsinks that had slipped out of place - they are (or should be) held in position by a couple of screws through the metal RF shielding.
-
Microsoft didn't. They had nothing to do with it. It's ANSI BASIC and it's the same on TI's mini-computers.
From [http://www.atarimagazines.com/creative/v10n9/171_Structured_programming_in.php]:
"The Call statement in ANSI Basic serves the same function as the GOSUB statement in Minimal Basic. Both statements transfer control to another part of the program; when that part is finished, control normally returns to the statement after the Call or GOSUB. In addition, the above Call statement identifies the variable s$ as a parameter, through which data may be sent to a program unit or, as in the present case, received from it."
So we have the best of both worlds, CALL *and* GOSUB?
-
1
-
-
The data lines to the EPROM are jumbled. If you re-order the bits in each byte as follows then it all makes sense:
Original data: D0-D1-D2-D3 D4-D5-D6-D7
EPROM data: D1-D5-D7-D0 D4-D6-D2-D3
For example, the first byte of the DSR header is AA (1010 1010), and this is 1E (0001 1110) in the EPROM.
-
Is that read direct off the DSR EPROM? Do you see the same data if you look at the DSR using MiniMem EasyBug? (Wondering if the address/data lines to the EPROM are jumbled, so that it reads correctly in situ.)
-
Oh, I guess I never cared about this for the 32k board, and with the FPGA design hosting the ROM, I just swapped [0:7] for [7:0] without thinking it through. So...
A0 is the MSb of the address bus.
D0 is the LSb of the data bus?
Did TI only number the address bus backwards from the rest of the world? Or should I be looking for a double flip in my design?
They numbered the address AND data buses the opposite way to the rest of the world. A0 is the MSb of the address bus, and D0 is the MSb of the data bus.
-
2
-
-
Was that TM990 basic TI's BASIC for DX10?
I remember reading on this forum something about TI, for the 99/4, wanted an ANSI compliant BASIC. Anyone remember where that tidbit came from?
The TM990 BASIC is different to the TI990/DX10 version.
The DX10 version is ANSI-based and contains lots of functionality for screen display and reading/writing files and records to external devices. It contains lots that you'll recognise from TI-99 Extended BASIC (as Casey said). A copy of the manual is here: http://bitsavers.informatik.uni-stuttgart.de/pdf/ti/990/basic/2308769-9701A_BASIC_refMan_Dec83.pdf.
With TM990 BASIC, input/output is limited to a serial terminal or cassette interface. It lets you get closer to the hardware, with commands for the CRU interface, directly accessing memory and controlling interrupts. A copy of the manual is here: http://bitsavers.informatik.uni-stuttgart.de/pdf/ti/TMS9900/tm990-100/MP308_TM990_POWER_BASIC_Reference_Manual_1979.pdf.
-
3
-
-
speaking from pure conjecture, Cortex BASIC is quite different from our 'TI BASIC', is it possible that is the BASIC that Microsoft employees worked on for TI?
'fraid not! Cortex BASIC is based on the version running on their TM990 system.
-
1
-
-
Sure, didn't it continue as ,"N:diskname"?
That sounds vaguely familiar.
-
1
-
-
Two Commodore PETs at school, then BBC Micros in the year or so before I left for college. At college, more PETs, a SWTP 6800 connected to a teletype, and occasionally an acoustic modem session to a PDP(?) at Southampton Uni.
Brother had an Acorn Atom at home.
Anyone else remember "OPEN 1,8,15" for disk operations on the PET? Same also for the C64?
-
Is there a list of parts needed for the basic board?
Is there a list of parts needed for a fully loaded board (if that is a thing)?
Sourcing for those parts (I can google, but maybe you have a good source)?
I'd like to price the kit out.
Possible price for the lone PCB?
Just curious at this point, but I'm looking to start tinkering about.
Parts list - http://www.stuartconner.me.uk/tms9900_breadboard/tms9900_breadboard.htm#parts_list.
All the spare PCBs from the first run have gone now. If I do a second run then they should be less than about $33 each - it depends on the quantity I order and if they include any free 'spares' with the order. I got rather a good deal with the first batch which is why they were cheap.

Stuart.
-
2
-
-
Thanks Stuart, I received mine Friday and I have already completed about a third of the work, till I ran out of seven pin sockets, have to order some more. Building my first real computer, awesome. Already dreaming of adding a 9938 or 58 and storage capability.

Excellent, glad it arrived OK.
It seems that some of the MAX232CPE/EPE chips I had have a rather short life. If your serial comms becomes garbled then get another one off eBay - they're cheap, but try to go one from somewhere other than China!
-
1
-

TMS 9900 Project PCB Available
in TI-99/4A Development
Posted
I've got some more PCBs for building your own TMS 9900 system if anyone is interested (also more PCBs for the TMS 99105 or 99110 system - see http://atariage.com/forums/topic/261979-tms-99105-project-pcb-available).
Cost is £27 + postage to you from the UK. This will get you:
-- a PCB
-- 64 pin socket for processor
-- D-type 9-pin socket
-- DC power socket
-- 5V to 12V converter module
-- 3.3uH inductor
-- 3 off resistor networks
For the other components you need, see the link in the first post on this thread. All the free ICs I was given are gone I'm afraid.
Send me a PM if interested.