Jump to content

Stuart

Members
  • Content Count

    1,020
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Stuart


  1. 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.


  2. 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.

     

    post-31406-0-76770800-1508022790_thumb.png

     

    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  RETURN

    Example:

    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?
    
    • Like 11

  3. 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.

    • Like 1

  4. 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 :P

     

    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.

    • Like 1

  5. 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.

    • Like 1

  6. 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.


  7. 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.

    post-31406-0-42789400-1505168165_thumb.jpg

    • Like 1

  8. 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.


  9. 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
    

  10. 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.


  11. 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.


  12. 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?

    • Like 1

  13. 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.


  14. 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?

     

    [email protected]

    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.

    • Like 2

  15. 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?

     

    [email protected]

     

    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.

    • Like 3

  16. 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?


  17. 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.

    • Like 2

  18. 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!

    • Like 1
×
×
  • Create New...