+FarmerPotato Posted January 28 Share Posted January 28 I found this unusual paper: COMPUTER SYSTEM CROSS-FERTILIZATION: MAKING YOUR TI 980 PLAY YOUR TMS 9900 by John D. Meng Presented at TI-MIX Atlanta 1979 It describes creating a cross-assembler for the new TMS9900 chip, within the assembler on the laboratory's TI 980A minicomputer. The TI 980 had a different instruction set than its successor, (you guessed it) the TI 990 minicomputer. However, the 980 assembler had two directives for defining new instructions! OPD (operation define) and FRM (Format a new instruction) Quote Using these two features allowed us, to produce an assembler for the TMS 9900 which executed on our TI 980-A system, the entire project (after the initial inspiration) requiring less than an hour to implement. The TMS 9900 assembler, including comments, consists of exactly 130 lines of code. The syntax looks scary--but they grew to love it. For example, the arithmetic format I instructions are defined with a FRM. There are constant values for the mnemonics and addressing modes. ARI FRM 4,2,4,2,4 BIT FIELDS FOR 9900 FORMAT I D EQU 0 I EQU 1 A EQU >A MOV EQU >C To assemble a MOV instruction, ARI MOV,I,0,D,2 MOV R2,*R0 which packs the 16 bits of a word, according to the FRM above: 1100 (four bits, opcode) 01 (two bits, register indirect, dest addressing mode) 0000 (four bits, dest register 0) 00 (two bits, register direct , src addressing mode) 0010 (four bits, src register 2) Note that the format here is opcode, destination, source... backwards... (a matter of debate) Another example, EXT FRM 6,4,2,4 MPY EQU >E EXT MPY,D,1,D,0 produces MPY R0,R1 In other cases, the format of a 9900 instruction fit neatly into the pattern of a completely unrelated 980 instruction, so they took advantage of that with the OPD directive. Format 8 of 9900 instructions, such as AI (add immediate), happen to fit into the TI 980 Format 7. This declares a mnemonic with Format 7: AI OPD >220,7 Then, how to debug the code? Quote Our solution was to connect a 9900 chip to our 980 via a standard 16-in/16-out data module. This connection allowed us to program the 980 to use a reserved block of its memory as the memory space of the 9900. Enough logic was added to the connection to allow the 980 to micro-step the 9900, to generate 9900 interrupts and to implement the CRU channel (see Figure 3) The 980 can set breakpoints at arbitrary points and then operate the 9900 chip until it reaches a breakpoint. This scheme was exactly what TI's AMPL microprocessor laboratory would later provide, of course with the cost of a new TI 990 bundled in. But programming and debugging in assembly was no joyride. Therefore they invented a little language. Reminiscent of the Forth inner loop, the interpreter follows a list, calling BLWP on each address. Translated back into TI syntax for y'all, the inner loop was: START LI R0,PROGM POINTER TO FIRST STEP (PSEUDO PC) RUN MOV *R0,R2 OPCODE IS PARAMETER POINTER JEQ START ZERO OP CODE MEANS RESTART INCT R0 STEP PSEUDO PC BLWP *R2 EXECUTE THE PSEUDO-INSTRUCTION JMP RUN LOOP The sample program is: PROGM @SCAL RESET @TIMR RESET @TIMR START @ADC ON FIN END. RESTART. which is, in 9900 syntax, PROGM DATA SCAL,RESET DATA TIMR,RESET DATA TIMR,START DATA ADC,ON DATA 0 FIN inside the SCAL routine, the parameter RESET is picked up via something like: MOV *R13,R0 MOV *R0,R0 INCT *R13 In the Epilog, the author makes me feel sad that this effort was superseded. What we have described is not a tutorial on what to do. Nearly everything we have done has been superceded in economic and efficient fashion by material now available from Texas Instruments. We still use our cross assembler simply because we have it and we are very familiar with it. However, TIBUG achieves much of what we were attempting with our cross-connection between the 980 and a 9900 chip, and the recent introduction of POWER BASIC supercedes our own pseudo-language developments. What we have described is,first of all, history. It is a story of challenges successfully met when a new and apparently useful device appeared without much manufacturer support. It is also a story of how to learn in great depth about a new device. Finally it is a story about the immeasurable value of ingenuity in the face of crucial challenges coupled with a perennial budget crunch. ------------ Some cute instruction mnemonics of the 980 are SNO (Skip on Not all Ones) and SOO (Skip On all Ones). All the conditional branches are called Skip and they only jump over the next instruction! You might follow a Skip with a BRU, branch unconditional, for the opposite case. I would like to have its directive BRR (Base Register Reset.) I imagine this as a valid 980 program: BRR ADD SNO BRU IDL Here is a gentle introduction to 980 assembly, prepared for the TI-MIX group (much more under bitsavers TI-980) I chuckled at this sequence, since CR refers to both Card Reader and Carriage Return. Hit it. Notice that our beloved name CS1 was used by the operating system to refer to the cassette tape unit. If you don't have enough grey hair: the Card Reader/Punch* was a frightful I/O device where a stack of paper cards held your data, punched out with little holes across 12 columns. For example, the numbers 0 through 9 were single punches of the columns 0 through 9... letter A would be 0 plus a hole in the "X" column, and so on. The 990 reference card still featured a table of punch codes, listing the 64 characters of IBM ECBDIC, followed by a helpful ASCII conversion table (also 64 codes...) Dave Pitts mentions a card reader for the 990. From the style of these two documents, it's for sure that 980 users had a sense of humor. 980s in working order were still put to use at TI, in the late 70s, alongside 990s. (see the speech lab manual that I uploaded.) *In the most antiquated lab course I had in college (6811 embedded lab), we had a network of computer terminals (MTS) connected to the IBM mainframe with all its disk storage and programs. Yet its 6811 assembler still referred to your input source file as "SCARDS" and output file as "SPUNCH". I forget what the next step was called--you referred to that assembler output as SCARDS again, and sent it out your terminal's second serial port (STYPE?), assuming the 6811 board was hooked up there and ready to receive it. Typically I avoided writing code on the lab terminal. Instead I logged into MTS and uploaded files from my Geneve 9640. Fast-Term (hmm) mapped the extended keys on the Geneve keyboard to MTS escape codes. Reference Meng, John D. (1979). COMPUTER SYSTEM CROSS-FERTILIZATION: MAKING YOUR TI 98C PLAY YOUR TMS 9900. February 1979. Lawrence Berkeley Laboratory, University of California at Berkeley. To be presented at 8th annual TI-MIX, Atlanta GA, 3/27/1979. Downloaded on 1/27/2023 from https://escholarship.org/content/qt1vz517x5/qt1vz517x5_noSplash_0a4bcf88c0d7a86260d9787b1bc5fc73.pdf?t=li5ywu TI-980 playing the TMS9900.pdf 4 Quote Link to comment Share on other sites More sharing options...
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.